TSQLQuery : Erreur 'SQLQuery1 : Cannot open a non-select statement'
Bonjour à vous,
J'utilise le composant TSQLQuery pour attaquer une BDD MySQL.
Je veux mettre une table à jour via:
Code:
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:
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.
[RESOLU] Erreur 'SQLQuery1 : Cannot open a non-select statement'
Citation:
Envoyé par
SoftChris
Bon alors monsieur JP CASSOU, les réponses ont elles apportées les réponses souhaitées, c'est pas la peine de venir se plaindre de Lazarus (qui soit dit en passant n'y était pour rien) et ensuite ne pas venir remercier les contributeurs voire au moins venir dire si le problème est résolu !
Je suis passé à autre chose entre temps (le pb a été temporairement contourné) donc réponse tardive.
Sinon, TSQLQuery.Open (et son collègue Close) ne doit être effectivement utilisé que pour des requêtes SELECT.
Par contre, il semble que la transaction doit être committée pour implémenter les modifs:
Code:
FSQLTransaction.Commit;
Donc: pb résolu et avec mes excuses pour cette réponse tardive.
Par contre, je maintiens que le TSQLQuery.Open / Close devrait être obligatoire et ne pas provoquer d'erreur liée à une requête non-SELECT, ceci pour des raisons d'homogénéité de l'utilisation de ce composant.