![]() |
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:
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.
for ... do
begin StartTransaction try SQL.Text:= .... Parameter .... ExecSQL Commit; except Rollback; ..... end end :hi: :roll: wie immer zu langsam |
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:
:gruebel:
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; Danke nochmal Gruß Jens |
Re: Exception richtig behandeln
Ich würde es andersherum schreiben:
Delphi-Quellcode:
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?
...
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; ... |
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: |
Re: Exception richtig behandeln
Also, das was DeddyH gezeígt hat, kann ich umsetzten und funktioniert auch. Allerdings das von
Zitat:
Kannst Du mir das mal erklären. Gruß Jens |
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. |
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 |
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: |
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 |
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. |
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