![]() |
Datenbank: MsSAL • Version: 2014 • Zugriff über: TADoQuery
Seltsames Phänomen mit ExexSQL
Hallo zusammen,
ich habe das Problem, dass mit folgendem Aufruf nicht sichergestellt ist, dass die Daten in der DB gelöscht werden obwohl Result = true zurück gegeben wird
Delphi-Quellcode:
Insgesamt sind es 4 Tabellen. Manchmal wurden die Daten in allen Tabellen gelöscht, manchmal wurden sie in einer der Tabellen nicht gelöscht.
var
lQuery: TAdoQuery; begin lQuery := TAdoQuery.Create(nil); lQuery.Connection := GetConnection(); Result := true; lQuery.SQL.Text := format('delete Table1 where RelID = %d', [iID]); Result := Result and (lQuery.ExecSQL > 0); lQuery.SQL.Text := format('delete Table2 where RelID = %d', [iID]); Result := Result and (lQuery.ExecSQL > 0); Nach der Umstellung auf
Delphi-Quellcode:
werden die Daten jetzt immer gelöscht. Diese Lösung ist eh besser für mich, aber ich frag mich trotzdem was bei der Booleschen Variante schief geht
Result := 0;
lQuery.SQL.Text := format('delete Table1 where RelID = %d', [iID]); Result := Result + lQuery.ExecSQL; lQuery.SQL.Text := format('delete Table2 where RelID = %d', [iID]); Result := Result + lQuery.ExecSQL; |
AW: Seltsames Phänomen mit ExexSQL
Mich wundert eher, dass das Statement ohne FROM überhaupt ausgeführt wird. Und falls es darum gehen sollte, Detaildaten zu einem Mastersatensatz zu löschen, würde ich das eher auf DB-Ebene über eine Löschregel handhaben.
|
AW: Seltsames Phänomen mit ExexSQL
Zitat:
![]() Zitat:
Das Problem ist hier das du den Result-Wert falsch behandelst. ExecSQL liefert die Anzahl der betroffenen Datensätze zurück. Ist dieser für eine Löschaktion 0, so ist result = False. Und wenn du im Projekt die Option eingestellt hast, Ausdrücke nur soweit wie nötig auszuführen sorgt ein
Delphi-Quellcode:
dafür das nur die Zeile bis zum erkennen von and ausgewertet wird und das ExecSQL nicht mehr aufgerufen wird.
Result := Result and (lQuery.ExecSQL > 0);
Das ist aber auch nicht nötig. ExecSQL wird ein Exception schmeißen wenn eine Löschaktion nicht erfolgreich sein sollte. |
AW: Seltsames Phänomen mit ExexSQL
NEIN, wieso sollte das eine Exception werfen? (das passiert nur, wenn es im DBServer eine Exception gab, z.B. durch fehlerhaftes SQL oder falsche Tabellen-/Feld-Namen)
Es konnte nichts gefunden werden, was zu Löschen war, ist KEIN Fehler, aber es konnte was nicht gelöscht werden, weil abhängige Referenz .. das schon.
Delphi-Quellcode:
um es nochmal richtig zu zeigen.
Result := (lQuery.ExecSQL > 0) and Result;
NICHT umstellen, sondern nur die Beschreibung lesen! ![]() |
AW: Seltsames Phänomen mit ExexSQL
Moin...8-)
unabhängig vom Problem solltest du immer Parameter benutzen! siehe: ![]()
Delphi-Quellcode:
lQuery.SQL.Text := format('delete Table1 where RelID = %d', [iID]);
... lQuery.SQL.Text := 'delete Table1 where RelID = :ID'; lQuery.ParamByName('ID').AsInteger := iID; |
AW: Seltsames Phänomen mit ExexSQL
Boolean Evaluation Shortcircuit {$B-},
wenn das Result aufgrund des Ausdrucks festliegt wird der Rest der Abfrage nicht mehr ausgewertet also aus result=result and (ibquery.execsql>0) wird result=result und das Query wird nie ausgeführt ![]() mfg Hannes edit:hab himitsu s Post übersehen |
AW: Seltsames Phänomen mit ExexSQL
Zitat:
Zitat:
![]() |
AW: Seltsames Phänomen mit ExexSQL
Das fehlende FROM war nicht das Problem. Hatte es nämlich auch so verstanden dass das in MsSQL optional ist. Da es im Source aber unterschiedlich gehandhabt wurde habe ich das vereinheitlicht.
Natürlich war das der Fehler: Zitat:
Gerd |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz