Bonjour à vous,

J'utilise le composant TSQLQuery pour attaquer une BDD MySQL.

Je veux mettre une table à jour via:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
procedure UpdateTableTroncons(const TR: TCanalTroncon);
  var
    Rq: String;
  begin
    try
      try
        Rq := Format('UPDATE %s ', [TABLE_TRONCONS]) +
              Format('SET LongueurTroncon=%.2f, TempsParcoursOptimal=%.2f ', [TR.LongueurTroncon, TR.TempsOptimal]) +
              Format('WHERE NomTroncon="%s" LIMIT %d;', [TR.NomTroncon, 1]);
        AfficherMessage(Rq);
        FSQLQuery.Open;
        FSQLQuery.SQL.Clear;
        FSQLQuery.SQL.Text := Trim(Rq);
        FSQLQuery.ExecSQL();
 
        FSQLQuery.ApplyUpdates(666);
        FSQLTransaction.Commit; // indispensable sinon çà ne marche pas
      except
        on E: Exception do AfficherMessage(E.Message);
      end;
    finally
      FSQLQuery.Close;
    end;
  end;
Cette section est dans une boucle:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
 //FSQLTransaction.StartTransaction;
  for i := 0 to GetNbTroncons - 1 do
  begin;
    myTroncon := GetTroncon(i);
    UpdateTableTroncons(myTroncon);
  end;
Commande MySQL:

UPDATE troncons_new SET LongueurTroncon=615.36, TempsParcoursOptimal=24.61 WHERE NomTroncon="Tr_5742.00 2" LIMIT 1;

Dès le deuxième tour de boucle, le message d'erreur suivant est envoyé:

SQLQuery1 : Cannot open a non-select statement

J'ai beau individualiser les requêtes, rien n'y fait.

Je ne sais que faire et çà fait deux heures que je galère avec çà.

Bien entendu, chaque requête est ouverte et fermée correctement.

L'équipe Lazarus, qui fait du très bon travail, gagnerait à améliorer le contrôle qualité des composants fondamentaux comme ceux d'interrogation de BDD. A mon avis, il n'est pas normal qu'un composant fonctionne une fois sur deux. Ceci occasionne d'énormes pertes de temps pour résoudre des problèmes qui n'ont pas lieu d'être.

On comprend pourquoi Embarcadero et consorts peuvent vendre très cher leurs produits: en milieu professionnel et institutionnel, le coût de la licence est souvent très largement compensé par la qualité des composants et de la documentation.