Delphi-PRAXiS
Seite 2 von 8     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   ID nicht gefunden nach last_insert_rowid() (https://www.delphipraxis.net/192717-id-nicht-gefunden-nach-last_insert_rowid.html)

nahpets 13. Mai 2017 20:59

AW: ID nicht gefunden nach last_insert_rowid()
 
Bitte Quelltext von refreshItems.

Was genau passiert da?

EdAdvokat 13. Mai 2017 21:17

AW: ID nicht gefunden nach last_insert_rowid()
 
Hier die Procedure RefeshItmems:
Delphi-Quellcode:
procedure TMainFRM.refreshItems(ID, Name, Vorname, Geb, Strasse, Nr, PLZ, Ort,
  Tel, email, Bemerkung: string);
var
  item: TListItem;
begin
  item:=lv.Items.Add;
  item.Caption:= ID;
  item.SubItems.Add(Name);
  item.SubItems.Add(Vorname);
  item.SubItems.Add(Geb);
  item.SubItems.Add(Strasse);
  item.SubItems.Add(Nr);
  item.SubItems.Add(PLZ);
  item.SubItems.Add(Ort);
  item.SubItems.Add(Tel);
  item.SubItems.Add(email);
  item.SubItems.Add(Bemerkung);
end;
die rufe ich dann nach UPDATE und INSERT auf.
ist das nicht ausreichend?

nahpets 13. Mai 2017 21:34

AW: ID nicht gefunden nach last_insert_rowid()
 
Delphi-Quellcode:
qMain.SQL.Text := 'SELECT LAST_INSERT_ROWID() AS ID FROM KONTAKTE';
qMain.Open;
if qMain.RecordCount > 0 then begin
  currentID := qMain.FieldByName('ID').AsString;
end else begin
  MessageDlg('LAST_INSERT_ROWID() liefert kein Ergebnis.',mtError,[mbok],0);
end;
qMain.Close;
Wie ist bei den ZEOS-Komponenten AutoCommit eingestellt?
Ebenso TransactIsolationLevel?

Eventuell gibt es da Abhängigkeiten, die es ZEOS ermöglichen, die Abfrage auf LAST_INSERT_ROWID() auszuführen, während bei anderen Datenbankschnittstellen hier kein Ergebnis geliefert wird.

EdAdvokat 13. Mai 2017 21:51

AW: ID nicht gefunden nach last_insert_rowid()
 
Hallo Stefan, das sind ja die fast unergründlichen Tiefen der Komponenten:
Bei den Zeos-Komp. ist AutoCommit:= true;
und TransactlatsolatronLavel:=tinone
was auch immer das bedeuten soll. Jedenfalls hast Du mich in die Spur gebracht und ich werde wohl morgen daraufhin die dbExpress-Komp.-Einstellungen prüfen.
Könnten noch andere Unterschiede maßgeblich sein? Es ist doch spannend, auf was man alles achten muss.

nahpets 13. Mai 2017 22:05

AW: ID nicht gefunden nach last_insert_rowid()
 
Als erstes interessiert mich, was bei meinem Quelltext 2 Posts höher rauskommt.

Exception, weil Feld nicht gefunden (also der bekannte Fehler) oder wird der Fehlerdialog angezeigt?

Das AutoCommit := True müsste bedeuten, dass das qMain.ExecSQL in einer eigenen Transaktion ausgeführt wird. Das Lesen von LAST_INSERT_ROWID() erfolgt also nach einem Commit.

Wenn andere Komponenten nicht jeweils eine eigene Transaktion machen, könnte es sein, dass es für LAST_INSERT_ROWID() noch keinen Wert gibt, weil der (eventuell) erst nach Abschluss einer Transaktion zur Verfügung steht.
Da müsste man sich dann mal durch die Datenbankdokumentation durchwühlen.

TransactIsolationLevel gibt an, ob Daten anderer Transaktionen gelesen werden, ob nur die per Commit festgeschriebenen oder auch die, die noch nicht per Commit festgeschrieben wurden ...

EdAdvokat 14. Mai 2017 08:49

AW: ID nicht gefunden nach last_insert_rowid()
 
Hallo Stephan, nach Einfügen deines Code kommt folgende Exception:
Zitat:

qMain: Das Feld 'ID' wurde nicht gefunden
Also die bekannte Meldung.
In den dbExpress-Komp. gibt es leider nicht die Einstellmöglichkeiten der Zeos-Komp.
Ich könnte auch das anze Prog. posten, denn es ist nicht groß und dient lediglich meiner Übung.

EdAdvokat 14. Mai 2017 09:22

AW: ID nicht gefunden nach last_insert_rowid()
 
setze ich
Delphi-Quellcode:
if qMain.RecordCount > 0 then begin
auf
Delphi-Quellcode:
RecordCount = 0 oder -1
kommt Dein geschriebener Meldungstext.
Der RecordCount sollte doch stets >0 sein. Also irgendwas hindert das Programm das Feld 'ID' zu finden. Mit Debugger das Prog. geprüft und genau an der Stelle
Delphi-Quellcode:
currentID := qMain.FieldByName('ID').AsString;
kommt die Exception. Es ist ja nicht weltbewegend und sicher könnte man damit leben, doch ich bin in der Lernphase und da interessiert mich so eine Kleinigkeit doch etwas, genau wie das Problem der einzelnen Darstellung des letzten veränderten Datensatzes ohne die vorhierigen Datensätze darzustellen nach Aufruf der Bearbeiten-Procedure.

himitsu 14. Mai 2017 09:45

AW: ID nicht gefunden nach last_insert_rowid()
 
Weil das schon mehrmals gesagt, aber immer wieder übersehn wurde:
Zitat:

Delphi-Quellcode:
qMain.SQL.Text := 'SELECT LAST_INSERT_ROWID() AS ID FROM KONTAKTE';
qMain.Open;
if qMain.RecordCount > 0 then begin

Delphi-Quellcode:
SELECT LAST_INSERT_ROWID() AS ID
ist eine globale Funktion
und
Delphi-Quellcode:
SELECT LAST_INSERT_ROWID() AS ID FROM KONTAKTE
würde den Wert mehrmals liefern, für jeden Datensatz in KONTAKTE. :angle:

nahpets 14. Mai 2017 09:55

AW: ID nicht gefunden nach last_insert_rowid()
 
Warum gibt es denn dann bei Zeos keinen Fehler, ansonsten aber schon?

Es müsste doch bei 'SELECT LAST_INSERT_ROWID() AS ID FROM KONTAKTE' n Ergebniszeilen kommen, die alle den gleichen Inhalt haben. Mit dem Zugriff auf die erste Zeile und die Spalte ID müsste man doch trotzdem das richtige Ergebns bekommen (auch wenn dieses Vorgehen dann nicht so wirklich korrekt und sinnvoll wäre.)

EdAdvokat 14. Mai 2017 10:38

AW: ID nicht gefunden nach last_insert_rowid()
 
verstehe ich himitsu richtig, dass die globale Funktion an dieser Stelle entbehrlich wäre und gestrichten werden sollte?
Nochmals habe ich das ganze im Prog. mit den Zeos-Komp. geprüft und da ist wirklich alles paletti. Der neue erstellte Datensatz wird sofort mit entsprechender ID! dargestellt und gespeichert, so wie ich es mir auch mit dem dbExpress-Komp-Prg. vorgestellt habe.
Im dbExpress-Prg. (mit auskommentierter Zeile!) wird nach Aufruf von übernehmen zwar der Datensatz angezeigt, jedoch ohne ID!. Erst nach Neustart des Programms ist der Datensatz dann mit entsprechender ID aufgeführt.
Es entsteht der Eindruck, dass im Prog. keine ID verarbeitet wird, aber die DB dann die ID vergibt, die dann nach Neustart des Programms exakt aufgeführt wird?!


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:45 Uhr.
Seite 2 von 8     12 34     Letzte »    

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