Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Fehlerabfang bei SQL: Insert klappt, Update nicht (https://www.delphipraxis.net/96494-fehlerabfang-bei-sql-insert-klappt-update-nicht.html)

GroHae 25. Jul 2007 12:44

Datenbank: MS SQLServer • Zugriff über: via ODBC

Fehlerabfang bei SQL: Insert klappt, Update nicht
 
Hallo zusammen,

ich versuche gerade einen Fehlerabfang in meinen Code einzubinden. Am ende solle es eine Exception Klasse geben. Weiß aber noch nicht wie das geht.
Meine ersten Schritte sehen so aus:

Für Update:
Delphi-Quellcode:
function TTblFirmenstamm.UpdRec(iRec: TRecFirmenstamm): boolean;
begin
  Result := true;
  with FQry do
  begin
    Close;
    SQL.text := 'UPDATE ' + GetTblName + ' SET ' +
      'UnternehmenNr_FK =:UnternehmenNr_FK, Standort=:Standort, Firmenname=:Firmenname, Strasse=:Strasse, PLZ=:PLZ, Ort=:Ort, '+
      'SQLDebitoren=:SQLDebitoren,SQLKreditoren=:SQLKreditoren,'+
      'DKSFirma=:DKSFirma,DKSJahr=:DKSJahr,DKSJahrYYYY=:DKSJahrYYYY,'+
      'FrachtKostenKnz=:FrachtKostenKnz,ProzessBereiche=:ProzessBereiche ' +
      'WHERE (FirmenNr_ID =:FirmenNr_ID)';
   try
      with iRec do
      begin
        ParamByName('FirmenNr_ID').asInteger := FirmenNr_ID;
        ParamByName('UnternehmenNr_FK').asInteger := UnternehmenNr_FK;
        ParamByName('Standort').asString     := Standort;
        ParamByName('Firmenname').asString   := Firmenname;
        ParamByName('Strasse').asString      := Strasse;
        ParamByName('PLZ').asString          := PLZ;
        ParamByName('Ort').asString          := Ort;
        ParamByName('SQLDebitoren').asString := SQLDebitoren;
        ParamByName('SQLKreditoren').asString := SQLKreditoren;
        ParamByName('DKSFirma').asString     := DKSFirma;
        ParamByName('DKSJahr').AsString      := DKSJahr;
        ParamByName('DKSJahrYYYY').AsInteger := DKSJahrYYYY;
        ParamByName('FrachtKostenKnz').Asinteger:= FrachtKostenKnz;
        ParamByName('ProzessBereiche').AsString := ProzessBereiche;
      end;
      ExecSQL;
    except
      on E: Exception do
          begin
            ShowMessage('Upsiiiii, Tommi da ist ein Fehler: ' + E.Message);
            Result := False;
          end;
      end;
  end;
end;
Für Insert:
Delphi-Quellcode:
function TTblFirmenstamm.InsRec(iRec: TRecFirmenstamm): boolean;
var
  cnstSQL : string;
begin
  cnstSQL := 'INSERT INTO ' + GetTblName + ' ' +
           '( ChgDate_ID, FirmenNr_ID, UnternehmenNr_FK, Standort, Firmenname,Strasse, PLZ, Ort, SQLDebitoren, SQLKreditoren, DKSFirma, DKSJahr, DKSJahrYYYY, FrachtKostenKnz, ProzessBereiche) ' +
    'VALUES (:ChgDate_ID,:FirmenNr_ID,:UnternehmenNr_FK,:Standort,:Firmenname,:Strasse,:PLZ,:Ort,:SQLDebitoren,:SQLKreditoren,:DKSFirma,:DKSJahr,:DKSJahrYYYY,:FrachtKostenKnz,:ProzessBereiche)';
  with FQry do
  begin
    Close; // Schließt die Datenmenge
    try
      if SQL.Text <> CnstSQL then
        SQL.text := CnstSQL;
      with iRec do
      begin
        ParamByName('ChgDate_ID').asDateTime := GetChgDateForInsRec;
        ParamByName('FirmenNr_ID').asInteger := FirmenNr_ID;
        ParamByName('UnternehmenNr_FK').asInteger := UnternehmenNr_FK;
        ParamByName('Standort').asString    := Standort;
        ParamByName('Firmenname').asString  := Firmenname;
        ParamByName('Strasse').asString     := Strasse;
        ParamByName('PLZ').asString         := PLZ;
        ParamByName('Ort').asString         := Ort;
        ParamByName('SQLDebitoren').asString := SQLDebitoren;
        ParamByName('SQLKreditoren').asString:= SQLKreditoren;
        ParamByName('DKSFirma').asString    := DKSFirma;
        ParamByName('DKSJahr').AsString     := DKSJahr;
        ParamByName('DKSJahrYYYY').AsInteger := DKSJahrYYYY;
        ParamByName('FrachtKostenKnz').Asinteger := FrachtKostenKnz;
        ParamByName('ProzessBereiche').AsString   := ProzessBereiche;
      end;
      ExecSQL;
      Result := True;
    except
      on E: Exception do
          begin
            ShowMessage('Tom da ist ein Fehler: ' + E.Message);
            Result := False;
          end;
    end;
  end;
end;

Was ich nicht verstehe ist, das ich wenn ich für Fehler sorge, ich bei der Insert Variante einen Fehler angezeigt bekomme bei der Update Variante aber nicht!

Warum bringt er bei Update keine Fehlermeldung?

RavenIV 25. Jul 2007 15:24

Re: Fehlerabfang bei SQL: Insert klappt, Update nicht
 
was für einen Fehler provozierst Du denn?
vielleicht ist das für das Update garkein Fehler?

GroHae 25. Jul 2007 15:34

Re: Fehlerabfang bei SQL: Insert klappt, Update nicht
 
Ich starte das Programm. Gehe in den Dialog zum Ändern eines Datensatzes.
Diesen Datensatz lösche ich dann in meiner Datenbank m.H. des SQL Server Enterprice Manager.
Dann wechsel ich wieder in mein Programm und Sage Update
--> Update auf einen Datensatz der gar nicht mehr existiert.

DeddyH 25. Jul 2007 15:39

Re: Fehlerabfang bei SQL: Insert klappt, Update nicht
 
Wenn Du sagst, mach ein Update auf den Datensatz, dessen Primärschlüssel dem angegebenen Wert entspricht, und es gibt diesen Datensatz nicht mehr, dann wird eben nichts aktualisiert. Wieso sollte da ein Fehler kommen? Versuch doch mal, für 2 Datensätze denselben Wert im Primärschlüssel zu vergeben, dann sollte es auch eine Exception geben.

GroHae 25. Jul 2007 20:29

Re: Fehlerabfang bei SQL: Insert klappt, Update nicht
 
hm :wiejetzt:

Wenn ich einen Update mache für den Datensatz X, dieser aber nicht mehr existiert, dann kann kein update gemacht werden. Ich würde das schon als Fehler sehen. Liege ich da wirklich falsch? :gruebel:


Ist dann Löschen von Datensatz X, obwohl Datensatz X nicht mehr existiert auch kein Fehler?

Deinen Vorschlag werde ich auf jeden fall morgen testen.

DeddyH 25. Jul 2007 20:33

Re: Fehlerabfang bei SQL: Insert klappt, Update nicht
 
Wenn es jedes Mal einen Fehler gäbe, wenn kein Datensatz mit den Suchkriterien existiert, wäre keine Datenbank zu gebrauchen ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:15 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