AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Seltsames Phänomen mit ExexSQL
Thema durchsuchen
Ansicht
Themen-Optionen

Seltsames Phänomen mit ExexSQL

Ein Thema von norwegen60 · begonnen am 10. Mai 2018 · letzter Beitrag vom 20. Mai 2018
Antwort Antwort
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
504 Beiträge
 
Delphi 12 Athens
 
#1

Seltsames Phänomen mit ExexSQL

  Alt 10. Mai 2018, 10:43
Datenbank: MsSAL • Version: 2014 • Zugriff über: TADoQuery
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:
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);
Insgesamt sind es 4 Tabellen. Manchmal wurden die Daten in allen Tabellen gelöscht, manchmal wurden sie in einer der Tabellen nicht gelöscht.
Nach der Umstellung auf
Delphi-Quellcode:
  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;
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Seltsames Phänomen mit ExexSQL

  Alt 10. Mai 2018, 10:55
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Seltsames Phänomen mit ExexSQL

  Alt 10. Mai 2018, 11:11
Mich wundert eher, dass das Statement ohne FROM überhaupt ausgeführt wird.
Beim MS SQL-Server ist das FROM ein optionales Schlüsselwort: https://docs.microsoft.com/de-de/sql...ql-server-2017

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.
Wenn du das alles in eine Transaktion packst kann hier nix passieren.


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

Result := Result and (lQuery.ExecSQL > 0); dafür das nur die Zeile bis zum erkennen von and ausgewertet wird und das ExecSQL nicht mehr aufgerufen wird.

Das ist aber auch nicht nötig. ExecSQL wird ein Exception schmeißen wenn eine Löschaktion nicht erfolgreich sein sollte.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.140 Beiträge
 
Delphi 12 Athens
 
#4

AW: Seltsames Phänomen mit ExexSQL

  Alt 10. Mai 2018, 13:05
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.


Result := (lQuery.ExecSQL > 0) and Result; um es nochmal richtig zu zeigen.

NICHT umstellen, sondern nur die Beschreibung lesen!
http://docwiki.embarcadero.com/RADSt...ler-Direktive)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (10. Mai 2018 um 16:26 Uhr) Grund: Klammer
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.292 Beiträge
 
Delphi 12 Athens
 
#5

AW: Seltsames Phänomen mit ExexSQL

  Alt 10. Mai 2018, 14:07
Moin...

unabhängig vom Problem solltest du immer Parameter benutzen!
siehe: https://de.wikipedia.org/wiki/SQL-Injection

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;
  Mit Zitat antworten Zitat
hstreicher

Registriert seit: 21. Nov 2009
220 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Seltsames Phänomen mit ExexSQL

  Alt 10. Mai 2018, 15:06
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

http://docs.embarcadero.com/products...ation_xml.html

mfg Hannes

edit:hab himitsu s Post übersehen

Geändert von hstreicher (10. Mai 2018 um 15:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Seltsames Phänomen mit ExexSQL

  Alt 10. Mai 2018, 16:01
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)
WEnn ein Datensatz wegen einer Regel auf DB-Ebene (Referenzielle Integrität, Zugriffsrechte) nicht gelöscht werden kann, dann gibts auch eine Exception.

NICHT umstellen, sondern nur die Beschreibung lesen!
http://docwiki.embarcadero.com/RADSt...iler-Direktive)
Aber dann schon bitte mit abschließender Klammer: http://docwiki.embarcadero.com/RADSt...ler-Direktive)
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
504 Beiträge
 
Delphi 12 Athens
 
#8

AW: Seltsames Phänomen mit ExexSQL

  Alt 20. Mai 2018, 09:43
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:
Und wenn du im Projekt die Option eingestellt hast, Ausdrücke nur soweit wie nötig auszuführen sorgt ein

Result := Result and (lQuery.ExecSQL > 0); dafür das nur die Zeile bis zum erkennen von and ausgewertet wird und das ExecSQL nicht mehr aufgerufen wird.
Danke
Gerd

Geändert von norwegen60 (20. Mai 2018 um 09:49 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz