Hallo,
ich komme Gedanklich bei meinen Überlegungen zu dem o.g. Thema nicht ganz hin :
Wenn ich alle Daten aus einer MS Access-Datenbank in ein DataSet reinschreibe (Visual Basic .NET) und in einer Tabelle eine Zeile hinzufüge, wie wird dann der Primary Key ermittelt ?
Angenommen in der mdb hat der letzte Eintrag die ID 61, und wird gelöscht. Somit ist die letzte ID die 60. Das Problem ist das bei einem neuen Eintrag die ID 61 nicht benutzt werden kann da dies von MSa verweigert wird.
Was mache ich nun, bzw. wie löst VB diese Problem.
Eigentlich müsste ja immer wenn der DataAdapter ein Update in die Datenbank schreibt die neue IDs geladen werden, da die vor einem Update nicht bekannt sind.
Hoffentlich versteht mich jemand und kann mir helfen das Rätsel zu enträtseln.
schonmal danke füe euere Bemühungen bisher.
MfG Hanussen
Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge
Hallo!
nun, die Zuweisung eines Primary Keys ist abhängig von dessen Datentyp. Hast Du einen anderen Datentyp als AutoWert (=AutoNumber) so kannst Du bei INSERT SQL Befehlen den Key selbst angeben. Ist der Datentyp des Keys "AutoWert", so ist eine Zuweisung nicht möglich. Dies liegt an der Charakteristik des Datentyps selbst. Access führt in diesem Fall für die jeweilige Tabelle einen impliziten Index. Hast Du also eine ID 61 und löschst diese (DELETE FROM .. WHERE ID=61;") und fügst Du danach eine neue Zeile hinzu, so erhält diese Zeile die ID 62, auch wenn 61 theoretisch frei wäre.
Bei ADO.NET gilt daher folgendes:
für den jeweiligen DataAdapter enthält der "InsertCommand" Parameter den SQL INSERT Befehl ohne Verweis auf den Primary Key. Falls Du Dir die InsertCommand mit Parametern selbst geschrieben hast (=untyped DataSet) so musst Du die "InserCommand" ändern.
Hoffe das hilft Dir ein wenig weiter...
Danke.
Das Problem wird ins Microsofts Datenbanken mit Visual-Basic.Net auch beschrieben. Das Problem liegt darin das der Primary Key erst von der Jet-DB-Engine ergänzt wird. Dummerweisse wird er jedoch nicht an das DataSet bei einem Update weitergegeben, daher weiss mein DataSet nicht welchen Key der neue Eintrag bekommen hat, und kann ihn damnach bei einem erneuten Update nicht wiederfinden.
Das Problem lässt sich anscheinend nur durch ein erneutes befüllen des DataSets realisieren.
MfG Hanussen
Wenn Du die Update methode des DataAdapters ausführst wird die boolsche variable "HasChanges" getestet. Falls diese "True" ist werden mittels "SelectCommand", "UpdateCommand" und "InsertCommand" alle Änderungen mit der Datenquelle (der DataCommand) synchronisiert.
Das Problem das Du beschreibst hab ich jetzt verstanden - leider hast Du Recht. Es ist nur auf äußerst komplizierte Weise möglich den Primary Key nach einem Insert sofort zurück zu erhalten. Es gibt jedoch eine diletantische, nicht fehlerfreie Alternative dieses Problem zu beheben. Du führst einfach nach einem INSERT noch einen SELECT Befehl aus, bei dem der Maximalwert der vorhandenen Primary Keys zurückgegeben wird. Dieser Wert ist dann der Primary Key. Also z.B.:
SELECT MAX(ID) FROM Tabelle;
Das Problem bei dieser Methode ist jedoch das sie nicht funktioniert wenn es viele gleichzeitige oder kurz aufeinander folgende Inserts gibt. Auch bereitet die Methode Probleme, da sie nicht mit Typed Datasets funktioniert!!
Hoffe ich habe Dein Problem halbwegs verstanden und diese Antwort lichtet das Dunkel ein wenig :-)