AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Exception richtig behandeln

Ein Thema von Jens Hartmann · begonnen am 4. Okt 2009 · letzter Beitrag vom 8. Jan 2010
Antwort Antwort
Seite 2 von 4     12 34      
Benutzerbild von haentschman
haentschman

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

Re: Exception richtig behandeln

  Alt 4. Okt 2009, 17:10
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.




wie immer zu langsam
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#12

Re: Exception richtig behandeln

  Alt 4. Okt 2009, 19:17
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;


Danke nochmal

Gruß Jens
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#13

Re: Exception richtig behandeln

  Alt 4. Okt 2009, 19:26
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?
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 haentschman
haentschman

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

Re: Exception richtig behandeln

  Alt 4. Okt 2009, 19:59
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)

  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#15

Re: Exception richtig behandeln

  Alt 4. Okt 2009, 20:19
Also, das was DeddyH gezeígt hat, kann ich umsetzten und funktioniert auch. Allerdings das von

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
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

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

Re: Exception richtig behandeln

  Alt 4. Okt 2009, 20:31
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 ?

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.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#17

Re: Exception richtig behandeln

  Alt 4. Okt 2009, 20:40
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???

Gruß Jens
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

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

Re: Exception richtig behandeln

  Alt 4. Okt 2009, 20:49
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
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#19

Re: Exception richtig behandeln

  Alt 4. Okt 2009, 21:04
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
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

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

Re: Exception richtig behandeln

  Alt 4. Okt 2009, 21:10
Geht mir nicht anders, sich in etwas einzuarbeiten und auszuprobieren ist das zeitaufwändigste überhaupt.

einen schönen Sonntag noch
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 09:57 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