Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datensätze werden nicht in Tabelle gespeichert. (https://www.delphipraxis.net/183814-datensaetze-werden-nicht-tabelle-gespeichert.html)

Walter Landwehr 6. Feb 2015 12:38

Datenbank: Firebird • Version: 2,5 • Zugriff über: IBO

Datensätze werden nicht in Tabelle gespeichert.
 
Hallo an alle Delphi und Firebird Experten,

ich habe folgendes Problem: Ich möchte aus einer alten Datenbank eine Tabelle in eine neue Datenbank mit veränderter Struktur Daten übernehmen. In der alten Tabelle sind 10145 Datensätze. Übernommen werden mir nur 9845. Genau die ersten 300 fehlen. Wie kann ich den Fehler abfangen, warum die Datensätze nicht geschrieben werden.

Hier mal mein Statement:

Delphi-Quellcode:
if (Query_Quelle.RecordCount > 0) then
    begin
      Query_Quelle.First;
      while not Query_Quelle.eof do
      begin
      try
        dmMain.TAMain.StartTransaction;
        Query_Ziel.Close;
          Query_Ziel.SQL.Clear;
         Query_Ziel.SQL.Add('insert into EVENTS (ID, ACTUALFINISH, ACTUALSTART, '
           + 'CAPTION, EVENTTYPE, FINISH, LABELCOLOR, LOCATION, MESSAGE, '
           + 'OPTIONS, PARENTID, RECURRENCEINDEX, REMINDERDATE, REMINDERMINUTESBEFORESTART, '
           + 'REMINDERRESOURCESDATA, RESOURCEID, STARTZEIT, STATE, TASKCOMPLETEFIELD, '
           + 'TASKINDEXFIELD, TASKLINKSFIELD, TASKSTATUSFIELD, GROUPID, PATIENTNR, '
           + 'PATIENTENNUMMER, SUCHWORT, IMWARTEZIMMER, SYNCIDFIELD, RECURRENCEINFO) '
           + 'Values (:ID, :ACTUALFINISH, :ACTUALSTART, '
           + ':CAPTION, :EVENTTYPE, :FINISH, :LABELCOLOR, :LOCATION, :MESSAGE, '
           + ':OPTIONS, :PARENTID, :RECURRENCEINDEX, :REMINDERDATE, :REMINDERMINUTESBEFORESTART, '
           + ':REMINDERRESOURCESDATA, :RESOURCEID, :STARTZEIT, :STATE, :TASKCOMPLETEFIELD, '
           + ':TASKINDEXFIELD, :TASKLINKSFIELD, :TASKSTATUSFIELD, :GROUPID, :PATIENTNR, '
           + ':PATIENTENNUMMER, :SUCHWORT, :IMWARTEZIMMER, :SYNCIDFIELD, :RECURRENCEINFO)');
        Query_Ziel.ParamByName('ID').Value := dmMain.GetGeneratorWert('GEN_TBL_EVENTS');
        Query_Ziel.ParamByName('ACTUALFINISH').AsDateTime := Query_Quelle.FieldByName('ACTUALFINISH').AsDateTime;
        Query_Ziel.ParamByName('ACTUALSTART').AsDateTime := Query_Quelle.FieldByName('ACTUALSTART').AsDateTime;
        Query_Ziel.ParamByName('CAPTION').AsString := Query_Quelle.FieldByName('CAPTION').AsString;
        Query_Ziel.ParamByName('EVENTTYPE').AsInteger := Query_Quelle.FieldByName('ETYPE').AsInteger;
        Query_Ziel.ParamByName('FINISH').AsDateTime := Query_Quelle.FieldByName('FINISH').AsDateTime;
        Query_Ziel.ParamByName('LABELCOLOR').AsInteger := Query_Quelle.FieldByName('LABELCOLOR').AsInteger;
        Query_Ziel.ParamByName('LOCATION').AsString := Query_Quelle.FieldByName('LOCATION').AsString;
        Query_Ziel.ParamByName('MESSAGE').AsString := Query_Quelle.FieldByName('EMESSAGE').AsString;
        Query_Ziel.ParamByName('OPTIONS').AsInteger := Query_Quelle.FieldByName('OPTIONS').AsInteger;
        Query_Ziel.ParamByName('PARENTID').AsInteger := Query_Quelle.FieldByName('PARENTID').AsInteger;
        Query_Ziel.ParamByName('RECURRENCEINDEX').AsInteger := Query_Quelle.FieldByName('RECURRENCEINDEX').AsInteger;
        Query_Ziel.ParamByName('REMINDERDATE').AsDateTime := Query_Quelle.FieldByName('REMINDERDATE').AsDateTime;
        Query_Ziel.ParamByName('REMINDERMINUTESBEFORESTART').AsInteger := Query_Quelle.FieldByName('REMINDERMINUTES').AsInteger;
//        Query_Ziel.ParamByName('REMINDERRESOURCESDATA').Value := Query_Quelle.FieldByName('REMINDERRESOURCESDATA').AsString;
        Query_Ziel.ParamByName('RESOURCEID').AsInteger := Query_Quelle.FieldByName('RESID').AsInteger;
        Query_Ziel.ParamByName('STARTZEIT').AsDateTime := Query_Quelle.FieldByName('STARTZEIT').AsDateTime;
        Query_Ziel.ParamByName('STATE').AsInteger := Query_Quelle.FieldByName('STATE').AsInteger;
//        Query_Ziel.ParamByName('TASKCOMPLETEFIELD').Value := 0;
//        Query_Ziel.ParamByName('TASKINDEXFIELD').Value := 0;
//        Query_Ziel.ParamByName('TASKLINKSFIELD').Value := '';
//        Query_Ziel.ParamByName('TASKSTATUSFIELD').Value := 0;
//        Query_Ziel.ParamByName('GROUPID').Value := 0;
        Query_Ziel.ParamByName('PATIENTNR').AsInteger := Query_Quelle.FieldByName('PATIENTNR').AsInteger;
        Query_Ziel.ParamByName('PATIENTENNUMMER').AsInteger := Query_Quelle.FieldByName('PATIENTNUMMER').AsInteger;
        Query_Ziel.ParamByName('SUCHWORT').AsString := Query_Quelle.FieldByName('PATIENTSUCHWORT').AsString;
        Query_Ziel.ParamByName('IMWARTEZIMMER').AsString := Query_Quelle.FieldByName('IMWARTEZIMMER').AsString;
        Query_Ziel.ParamByName('SYNCIDFIELD').AsString := Query_Quelle.FieldByName('SYNCIDFIELD').AsString;
        Query_Ziel.ParamByName('RECURRENCEINFO').AsString := Query_Quelle.FieldByName('RECURRENCEINFO').AsString;
        Query_Ziel.ExecSQL;
        Query_Quelle.Next;
      finally
        dmMain.TAMain.RollBackRetaining;
      end;
      end;
    end;
Beim Debuggern wird der ExecSQL Befehl im ersten Datensatz auch ausgeführt jedoch landet der Datensatz nicht in die Tabelle. Trigger und sonstiges habe ich deaktiviert. Die aus kommentierten Zeilen sind Felder in der neuen Struktur und sind nicht relevant.

Kann mir jemand einen Tipp geben, wie ich abfangen kann warum der Datensatz nicht geschrieben wird.
Vielen Dank schon mal im voraus.

mkinzler 6. Feb 2015 12:53

AW: Datensätze werden nicht in Tabelle gespeichert.
 
Delphi-Quellcode:
dmMain.TAMain.RollBackRetaining;
ist recht ungeschickt.

Zudem würde ich
Delphi-Quellcode:
         Query_Ziel.SQL.Text := 'insert into EVENTS (ID, ACTUALFINISH, ACTUALSTART, '
           + 'CAPTION, EVENTTYPE, FINISH, LABELCOLOR, LOCATION, MESSAGE, '
           + 'OPTIONS, PARENTID, RECURRENCEINDEX, REMINDERDATE, REMINDERMINUTESBEFORESTART, '
           + 'REMINDERRESOURCESDATA, RESOURCEID, STARTZEIT, STATE, TASKCOMPLETEFIELD, '
           + 'TASKINDEXFIELD, TASKLINKSFIELD, TASKSTATUSFIELD, GROUPID, PATIENTNR, '
           + 'PATIENTENNUMMER, SUCHWORT, IMWARTEZIMMER, SYNCIDFIELD, RECURRENCEINFO) '
           + 'Values (:ID, :ACTUALFINISH, :ACTUALSTART, '
           + ':CAPTION, :EVENTTYPE, :FINISH, :LABELCOLOR, :LOCATION, :MESSAGE, '
           + ':OPTIONS, :PARENTID, :RECURRENCEINDEX, :REMINDERDATE, :REMINDERMINUTESBEFORESTART, '
           + ':REMINDERRESOURCESDATA, :RESOURCEID, :STARTZEIT, :STATE, :TASKCOMPLETEFIELD, '
           + ':TASKINDEXFIELD, :TASKLINKSFIELD, :TASKSTATUSFIELD, :GROUPID, :PATIENTNR, '
           + ':PATIENTENNUMMER, :SUCHWORT, :IMWARTEZIMMER, :SYNCIDFIELD, :RECURRENCEINFO);';
vor die Schleife ziehen.

p80286 6. Feb 2015 14:28

AW: Datensätze werden nicht in Tabelle gespeichert.
 
Zitat:

Zitat von Walter Landwehr (Beitrag 1289008)
In der alten Tabelle sind 10145 Datensätze. Übernommen werden mir nur 9845. Genau die ersten 300 fehlen. Wie kann ich den Fehler abfangen, warum die Datensätze nicht geschrieben werden.

mach Dir mal ein Protokoll, was da als SQL-Insert übergeben werden soll.
Wenn es keine (formal)Fehlermeldung gibt, ist wohl an den Daten was faul.

Gruß
K-H

TRomano 6. Feb 2015 14:53

AW: Datensätze werden nicht in Tabelle gespeichert.
 
Vielleicht macht es auch Sinn einen SQL-Monitor mitlaufen zu lassen ...

hstreicher 6. Feb 2015 15:55

AW: Datensätze werden nicht in Tabelle gespeichert.
 
die Query_Ziel.Execsql in ein Try Except kapseln und im Except Bereich die Fehlermeldung auswerfen

Delphi-Quellcode:
try
  Query_Ziel.ExecSQL
except
  on e: Exception Do // EIBError wie das bei IBO genau heißt weiß ich nicht
     Begin
       s := e.message;
       Showmessage(s);
     End
     Else
     Begin
       s := ExceptObject.ClassName;
       Showmessage(s);
    End;
end;
und dann ggf die Fehlermeldung posten

olaf 7. Feb 2015 09:41

AW: Datensätze werden nicht in Tabelle gespeichert.
 
Hallo,

Du startes die Transaction aber ich kann kein commit sehen.

Olaf

Sir Rufo 7. Feb 2015 09:50

AW: Datensätze werden nicht in Tabelle gespeichert.
 
Zitat:

Zitat von hstreicher (Beitrag 1289043)
die Query_Ziel.Execsql in ein Try Except kapseln und im Except Bereich die Fehlermeldung auswerfen

Delphi-Quellcode:
try
  Query_Ziel.ExecSQL
except
  on e: Exception Do // EIBError wie das bei IBO genau heißt weiß ich nicht
     Begin
       s := e.message;
       Showmessage(s);
     End
     Else
     Begin
       s := ExceptObject.ClassName;
       Showmessage(s);
    End;
end;
und dann ggf die Fehlermeldung posten

Bitte nicht!

Die Vorgehensweise zur Ausführung eines SQL-Statements ist immer diese hier
Delphi-Quellcode:
Connection.StartTransaction;
try
  Query.ExecSQL;
  Connection.Commit;
except
  Connection.Rollback;
  raise;
end;
Um die Anzeige der Exception kümmert sich die Anwendung
Delphi-Quellcode:
TApplication
, denn die zeigt dann diese gefürchtete MessageBox mit dem Stoppzeichen an. :roll:

In einem Thread sieht das anders aus, da befindet sich die Exception in Delphi-Referenz durchsuchenTThread.FatalException, die man dann ausgeben kann, wenn der Thread beendet wurde. Und zwar mit Delphi-Referenz durchsuchenTApplication.ShowException oder indem man einfach eine neue Exception wirft, die ja dann auch von der Anwendung automatisch angezeigt wird.


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