Problem mit TQuery
-
Hi,
ich habe ein Problem mit der TQuery-Klasse:
und zwar erhalte ich wenn ich ein Kommando ("DELETE FROM xyz") über ExecSQL(); ausführen will eine Exception mit der Fehlermeldung
Allgemeiner SQL-Fehler.
[Microsoft][ODBC Driver Manager] Fehler in der Funktionsreihenfolge.Was soll das heißen. Ich habe ja nur einen Befehl also welche Reihenfolge meint er damit.
Der Befehl als solches funktioniert übrigens wunderbar wenn ich ihn direkt an die Datenbank schicke.Wenn ich absichtlich einen Fehler in das SQL-Kommando einbaue, so erhalte ich auch eine entsprechende Fehlermeldung mit der ich was anfangen kann, wie z.B.
"Error at or near '*' ...".
Das heisst für mich das das Kommando richtig ist. Aber was habe ich vergessen?Hier mein Quellcode:
TQuery *qryDelete = new TQuery(NULL); qryDelete->DatabaseName = "ddd"; qryDelete->DataSource = mdlPostgres->dsStaffData; qryDelete->SQL->Add("DELETE FROM xyz"); qryDelete->Active = true; qryDelete->ExecSQL();mdlPostgres ist mein DatenModul.
dsStaffData ist mein DataSource-Objekt welches mit einem TTable Objekt verknüpft ist.Irgendwelche Ideen?
Danke im voraus
cu Errraddicator
-
was um alles in der welt soll das
active = true und execsql?
also eins von beiden sollte reichen.....
-
Das war lediglich weil es sowohl mit "Active = true" als auch mit "ExecSQL()" alleine nicht funktioniert hat.
Quasi eine "Verzweiflungstat" da mir die Ideen ausgegangen sind.
-
nur ein Schuss ins Blaue: Muss TQuery->RequestLive = true gesetzt werden? Könnte aber auch an dem TTable liegen. Was passiert, wenn Du ein eigenes DataSet für die Query verwendest? Ist TTable geöffnet, wenn Du versuchst die Daten zu löschen? Wenn ja schließ es vorher mal.
Der Code als solches sieht korrekt aus.
Da Du aber offensichtlich den gesamten Tabelleninhalt löschen willst, solltest Du dir mal DROP TABLE und CREATE TABLE ansehen. Eine Tabelle zu komplett zu entfernen und neu zu erstellen ist im Regelfall deutlich schneller, als die Datensätze aus der Tabelle zu entfernen. Es sei denn, Du hast ein AutoInc Feld in der Tabelle, das nicht zurückgesetzt werden darf.
Joe_M.
-
Ich habe Deine Vorschläge mal probiert, hat aber alles nix genützt.
Was komischerweise funktioniert, ist wenn ich einfach das DELETE-Kommando durch eine SELECT-Anweisung ersetze.
Warum funktioniert das Select und das Delete nicht?
Die Tabelle ist auch "ReadOnly = false" gesetzt.Irgendeine Idee?
Danke im voraus
cu Errraddicator
-
Lösung gefunden:
an meinem Quellcode ist gar nix falsch!Das Problem war folgendes:
Die Tabelle ist bereits leer.Aber warum er dann eine Exception ausspuckt, und dann auch noch so eine Wirsche?
Naja trotzdem Danke für Eure Mühe.
cu Errraddicator
-
LOL...
Das ist wirklich ziemlich hinterhältig...
Dann würde mich doch noch interessieren, ob diese Fehlermeldung auch kommt, wenn Du versuchst einen bestimmten Datensatz zu löschen, dieser aber nicht in der Tabelle ist. Dies sollte nämlich kommentarlos funktionieren, auch wenn nichts gelöscht werden kann.
Wenn es funktioniert, kannst Du die Delete-Anweisung ja so erweitern, dass eine Where-Klausel drin ist, die alle Datensätze als Ergebnis liefert. Ansonsten mußt Du halt vorher prüfen, ob die Tabelle leer ist, oder nicht.
Aber wie bereits gesagt, mache ich das über Drop / Create Table. Je nach Anzahl der Datensätze in der Tabelle ist das gravierend schneller.
Joe M.
-
also beim delete immer execsql nutzen. wo genau ist eigetnlcih das delete der query zum anfang? du fügst einen sql-sting ein leerst die querry aber nie.
und solche fehler kann man auch gut durch try/catch oder wie auch immer abfangen. es gibt auch die möglichkeit sql-statements direkt herauszufiltern..
setzt du die query oder datasource auch wieder auf false irgendwo?
-
[quote="*keinerdu fügst einen sql-sting ein leerst die querry aber nie.
[/quote]Das ist auch nicht nötig, da das TQuery-Objekt dynamisch erzeugt wird und es somit garantiert leer ist...
Joe_M.
-
richtig aber ich hoffe nur er verwendet sie nicht nochmal bevor sie zerstört wird....
naja wird er schon machen...