Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi PostgreSQL - Keine ID nach Insert (https://www.delphipraxis.net/137973-postgresql-keine-id-nach-insert.html)

NetSonic 1. Aug 2009 09:03

Datenbank: PostgreSQL • Version: 8.3 • Zugriff über: TADO und ODBC

PostgreSQL - Keine ID nach Insert
 
Hallo!

Ich habe hier ein Problem mit meinem Programm und der PostgreSQL-Datenbank.
Ich nutzte zur Verbindung mit der Datenbank den PostgreSQL ODBC-Treiber und die TADO-Komponenten (TADOConnection, TADODataSet und TADOQuery). Wenn ich jetzt in meine Kundendatenbank schreiben will, gehe ich wie folgt vor:

- Ich lade die Tabelle "tblcustomer" in eine DBGrid.
- Ich mache ein TADOQuery.Insert
- Ich lasse den Benutzer alle bekannten Daten eingeben.
- Anschließend mache ich ein TADOQuery.Post

Der Datensatz wird erfolgreich angelegt, allerdings ist das Feld "ID" (serial) immer 0, auch bei weiteren Inserts. Erst wenn ich die Query schließe und einen neuen SELECT mache, sind die Werte korrekt. Bekomme deswegen auch häufig den Fehler "Die zum aktualisieren angegebene Zeile ist nicht vorhanden oder wurde gelöscht".

Ich befürchte, dass es etwas mit den Transaktionen der PostgreSQL-Datenbank zu tun hat, aber ich hab zur Zeit überhaupt keine Idee, wie ich dafür sorgen kann, dass nach einem TADOQuery.Post sofort die Daten geschrieben werden und ich eine gültige ID erhalte.

Vielleicht hat da jemand von Euch einen Tipp?

Danke und Gruß
NetSonic

Bernhard Geyer 1. Aug 2009 09:35

Re: PostgreSQL - Keine ID nach Insert
 
Ich würde mal native Zugriffskompos wie von Microolap testen. Bei dem riesen Umweg über ADO und ODBC ist die Gefahr sehr hoch das Probleme auftauchen.

NetSonic 1. Aug 2009 09:48

Re: PostgreSQL - Keine ID nach Insert
 
Danke für den Hinweis, aber ich kann mir nicht wirklich vorstellen, dass das Problem auf die ODBC-Treiber und ADO zurückzuführen sein soll, wobei ich es natürlich keinesfalls ausschließen möchte!

Ich befürchte, dass ich die Transaktion nach einem Insert manuell anstoßen muss. Nur fehlt mir gerade der Ansatz, wie ich das machen könnte...

mkinzler 1. Aug 2009 09:50

Re: PostgreSQL - Keine ID nach Insert
 
Zitat:

Ich befürchte, dass ich die Transaktion nach einem Insert manuell anstoßen muss. Nur fehlt mir gerade der Ansatz, wie ich das machen könnte...
Wenn dann vorher. Aber innerhalb einet Transaktion müsste die ID sofort vergeben werden/verfügbar sein.

NetSonic 1. Aug 2009 10:02

Re: PostgreSQL - Keine ID nach Insert
 
Naja, ich denke die ID ist auch verfügbar. Nur wird Sie mir erst nach einem schließen und komplett neuen SELECT-Statement angezeigt. Habe mittlerweile herausgefunden, dass, wenn ich TADOQuery.CursorLocation von clUseClient auf clUseServer setze, dann bekomme ich die ID sofort angezeigt. Allerdings werden dann meine Zeilenfärbungen im DBGrid nicht mehr angezeigt, die ich im OnDrawColumnCell eingestellt habe...?!?!

mkinzler 1. Aug 2009 10:06

Re: PostgreSQL - Keine ID nach Insert
 
Versuche mal nach dem Insert die Daten neu zu fetchen

NetSonic 1. Aug 2009 10:15

Re: PostgreSQL - Keine ID nach Insert
 
:gruebel:
Ähm, was meinst Du jetzt mit Fetchen?
Also Reload oder Refresh mit ADOQuery helfen leider auch nicht, falls Du das meinst.

NetSonic 12. Aug 2009 15:56

Re: PostgreSQL - Keine ID nach Insert
 
Hey Leute,

ich muss das Problem nochmal wieder aufgreifen. Wenn ich also nach einem Post die Query schließe und neu lade, dann habe ich die ID. Das macht bei ein paar Datensätzen auch nichts, allerdings wird es zum Problem sobald ich mehr als 1000 Zeilen habe. Dann dauert es einfach länger und für den Kunden zu lange.

Mit MySQL hatte ich immer sofort die ID, die mir dann auch nach dem Post z.B. gleich in einer TDBGrid angezeigt wurde. Aber mit Postgre bekomme ich das nicht hin... eben nur, wenn ich TADOQuery.CursorLocation von clUseClient auf clUseServer setzte, dann geht es... aber dann gibt's halt Probleme beim färben der Zeilen in der DBGrid. Das macht er dann nicht mehr...

Hat vielleicht noch jemand einen Tipp für mich?

Gruß NetSonic


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