Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Exception richtig behandeln (https://www.delphipraxis.net/141185-exception-richtig-behandeln.html)

haentschman 4. Okt 2009 16:10

Re: Exception richtig behandeln
 
wenn ich dich richtig verstanden habe möchtest du nur die Datensätze eintagen, die kpl. und gültige Werte haben. Alles andere soll über die Exception abgefangen werden.

sinngemäß, da du mit Zeos arbeitest.
Delphi-Quellcode:
for ... do
  begin
    StartTransaction
    try
      SQL.Text:= ....
      Parameter ....
      ExecSQL

      Commit;
    except
      Rollback;
      .....
    end
  end
damit hat jeder Datensatz eine eigene Transaktion bekommen. Wenn die Werte ungültig sind läuft das ganze in´s except und die Transaktion wird zurückgenommen. Vieleicht solltest du aber schon beim Parser auf ungültige Werte prüfen und entsprechend reagieren. Die Feldgrößen würde ich größer wählen falls du nicht weist, wie die Strings ausfallen.

:hi:


:roll: wie immer zu langsam

Jens Hartmann 4. Okt 2009 18:17

Re: Exception richtig behandeln
 
Hallo und danke an alle,

habe das ganze jetzt mal nach Euren Vorschlägen umgebaut und es funktioniert. Wäre jetzt nur die Frage, weil ich wie schon gesagt, mit den Exeptions nicht so sicher bin, ob das Soweit OK ist.

Hier mal der funktionierende Code...

Delphi-Quellcode:
procedure TImportForm.DisplayResult(Parser: TMySimpleBaseParser);
var
  i: Integer;
  ID : Integer;
  Daten : TOMBSerie;
  Fehlerliste : TStringlist;
  OutDatum : TDateTime;
begin
  ID := 1;
  ProgBarDatei.Max := High(Parser.EntriesMB256);
  VST.BeginUpdate;

  for i := 0 to High(Parser.EntriesMB256) do begin
    Daten := TOMBSerie.Create;
      with Daten do
        begin
          try
          if TryStrToDate(Parser.EntriesMB256[i].Datum,OutDatum) = true then
          begin
          DM_PS.Qry_InsertMB256.Close;
          DM_PS.QryImportMB256.ParamByName('LfdNr').AsInteger := Parser.EntriesMB256[i].LfdNr;
          DM_PS.QryImportMB256.ParamByName('Datum').AsDate := OutDatum;
          DM_PS.QryImportMB256.ParamByName('Uhrzeit').AsTime := StrToTime(Parser.EntriesMB256[i].Uhrzeit);
          DM_PS.QryImportMB256.ParamByName('Ereignis').AsString := Parser.EntriesMB256[i].Ereignis;
          DM_PS.QryImportMB256.ParamByName('Teilnehmer').AsString := Parser.EntriesMB256[i].Teilnehmer;
          DM_PS.QryImportMB256.ParamByName('Bereich').AsString := Parser.EntriesMB256[i].Bereich;
          DM_PS.QryImportMB256.ExecSQL;
          DM_PS.ConPSSecur.Commit;
          end
          else
          begin
            FehlerMemo.Lines.Add('Fehler in Datensatz '+IntToStr(Parser.EntriesMB256[i].LfdNr));
            FehlerMemo.Lines.Add('In Datei');
            FehlerMemo.Lines.Add(Label1.Caption);
            FehlerMemo.Lines.Add('');
            Label9.Caption := IntToStr(StrToInt(Label9.Caption)+1);
          end;
          except
          DM_PS.ConPSSecur.Rollback;

          end;

          DM_PS.QrySelectMaxIDMB256.Open;

          Daten.ID := DM_PS.QrySelectMaxIDMB256.FieldByName('ID').AsInteger;
          Daten.LfdNr := Parser.EntriesMB256[i].LfdNr;
          Daten.Datum := Parser.EntriesMB256[i].Datum;
          Daten.Uhrzeit := Parser.EntriesMB256[i].Uhrzeit;
          Daten.Ereignis := Parser.EntriesMB256[i].Ereignis;
          Daten.Teilnehmer := Parser.EntriesMB256[i].Teilnehmer;
          Daten.Bereich := Parser.EntriesMB256[i].Bereich;
        end;
      VST.AddChild(nil, Daten);
      DM_PS.QrySelectMaxIDMB256.Close;
      Label6.Caption := IntToStr(StrToInt(Label6.Caption)+1);
      ProgBarDatei.Position := ID;
      Inc(ID);
  end;
  VST.ScrollIntoView(VST.GetLast, true);
  VST.EndUpdate;
  DM_PS.QrySelectMaxIDMB256.Close;
end;
:gruebel:

Danke nochmal

Gruß Jens

DeddyH 4. Okt 2009 18:26

Re: Exception richtig behandeln
 
Ich würde es andersherum schreiben:
Delphi-Quellcode:
...
      with Daten do
        begin
         
          if TryStrToDate(Parser.EntriesMB256[i].Datum,OutDatum){ = true} then
            try
              DM_PS.Qry_InsertMB256.Close;
              DM_PS.QryImportMB256.ParamByName('LfdNr').AsInteger := Parser.EntriesMB256[i].LfdNr;
              DM_PS.QryImportMB256.ParamByName('Datum').AsDate := OutDatum;
              DM_PS.QryImportMB256.ParamByName('Uhrzeit').AsTime := StrToTime(Parser.EntriesMB256[i].Uhrzeit);
              DM_PS.QryImportMB256.ParamByName('Ereignis').AsString := Parser.EntriesMB256[i].Ereignis;
              DM_PS.QryImportMB256.ParamByName('Teilnehmer').AsString := Parser.EntriesMB256[i].Teilnehmer;
              DM_PS.QryImportMB256.ParamByName('Bereich').AsString := Parser.EntriesMB256[i].Bereich;
              DM_PS.QryImportMB256.ExecSQL;
              DM_PS.ConPSSecur.Commit;
            except
              DM_PS.ConPSSecur.Rollback;
            end
          else
          begin
            FehlerMemo.Lines.Add('Fehler in Datensatz '+IntToStr(Parser.EntriesMB256[i].LfdNr));
            FehlerMemo.Lines.Add('In Datei');
            FehlerMemo.Lines.Add(Label1.Caption);
            FehlerMemo.Lines.Add('');
            Label9.Caption := IntToStr(StrToInt(Label9.Caption)+1);
          end;
...
Wobei ich vielleicht nicht jeden Datensatz committen würde, sondern in Blöcken von z.B. 50. Und müsste anschließend nicht eine neue Transaktion gestartet werden?

haentschman 4. Okt 2009 18:59

Re: Exception richtig behandeln
 
Hallo Jens,

ich vermisse auch den Start der Transaktion. Zeos kann nur eine. Wenn AutoCommit deiner Connection auf True steht wird automatisch mit ExecSQl ein "Commit" ausgeführt. (Wie wir wissen, nur ein SoftCommit) Somit greift dein Commit eh nicht. Wie es mit dem Rollback aussieht hab ich noch nicht getestet, da ich immer eine separate Transaktion aufmache. (StartTransaktion...Commit...Rollback)

:hi:

Jens Hartmann 4. Okt 2009 19:19

Re: Exception richtig behandeln
 
Also, das was DeddyH gezeígt hat, kann ich umsetzten und funktioniert auch. Allerdings das von

Zitat:

Zitat von haentschmen
ich vermisse auch den Start der Transaktion. Zeos kann nur eine. Wenn AutoCommit deiner Connection auf True steht wird automatisch mit ExecSQl ein "Commit" ausgeführt. (Wie wir wissen, nur ein SoftCommit) Somit greift dein Commit eh nicht. Wie es mit dem Rollback aussieht hab ich noch nicht getestet, da ich immer eine separate Transaktion aufmache. (StartTransaktion...Commit...Rollback)

mit der Start Transaktion versteh ich nicht so ganz. Die Daten werden doch bei mir in die Datenbank geschrieben, das funktioniert doch alles.

Kannst Du mir das mal erklären.

Gruß Jens

haentschman 4. Okt 2009 19:31

Re: Exception richtig behandeln
 
Zeos hat standardmäßig eine Transaktion. Das heißt mit jedem ExecSQL (bei AutoCommit = True) wird diese Transaktion intern Commited und eine neue geöffnet. Dein Commit ist unnötig.

wenn du jetzt z.B. mehrere SQL Anweisungen als "Block" abarbeiten willst machst du eine neue Transaktion auf.

StartTransaktion
try
ExecSQL1
ExecSQL2
ExecSQL3
Commit
except
Rollback
end

tritt in einer der SQL Anweisungen ein Fehler auf werden alle SQL Anweisungen zurückgenommen, da sie in einer Transaktion laufen.

Unterschied verstanden ? :hi:

PS: ich mache mir standardmäßig eine neue auf. Auch mit nur einer SQL Anweisung. Es könnte ja noch eine dazukommen und du kannst genau festlegen wann Commited wird.

Jens Hartmann 4. Okt 2009 19:40

Re: Exception richtig behandeln
 
Ich habe in meiner Connection AutoCommit auf false sitzen. Deshalb führe ich das Commit aus.

Dachte bislang das das OK so ist.

Sollte man das anders machen??? :gruebel:

Gruß Jens

haentschman 4. Okt 2009 19:49

Re: Exception richtig behandeln
 
wenn AutoCommit = False dann ist dein Commit ok und nötig. Dann ist das so in Ordnung. Wenn du aber z.B. in mehrere Tabellen schreiben möchtest und die Daten immer komplett sein müssen solltest du eine neue Transaktion öffnen und die SQL Anweisungen damit "zusammenfassen".

hoffe trotzdem dir geholfen zu haben :hi:

Jens Hartmann 4. Okt 2009 20:04

Re: Exception richtig behandeln
 
Ja, aufjedenfall.

Ich bin echt immer und über jede Hilfe froh. Es ist als Hobbyprogrammierer nicht immer einfach, wenn man die Sachen alle erlesen muss. Das Thema Programmieren, ist ja schließlich kein kleines.

Also nochmal Danke.

Gruß Jens

haentschman 4. Okt 2009 20:10

Re: Exception richtig behandeln
 
Geht mir nicht anders, sich in etwas einzuarbeiten und auszuprobieren ist das zeitaufwändigste überhaupt.

einen schönen Sonntag noch :hi:


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:45 Uhr.
Seite 2 von 4     12 34      

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-2025 by Thomas Breitkreuz