2009-05-15 3 views
1

Wie kann der Primärschlüssel einer eingefügten Zeile am besten abgerufen werden, wenn ODBC-Objekte in .NET verwendet werden?Kann ich den Primärschlüssel einer eingefügten Zeile mit ODBC erhalten?

Zum Beispiel (VB):

Dim command As OdbcCommand = gOdbcConn.CreateCommand() 
command.CommandText("INSERT INTO auhinode (node_key, node_desc) VALUES (0, 'New Node')") 
... 
Dim result As Integer = command.ExecuteNonQuery() 

Ich habe ein paar anderen Vorschläge here gesehen, aber ich frage mich, ob es Lösungen speziell für die ODBC-Objekte ist?

Bearbeiten: Der Grund, warum wir ODBC verwenden, ist, weil wir 3 verschiedene Datenbanken unterstützen - SQL Server, Oracle, Informix.

+1

Welche Datenbank? SQL Server? –

+0

Sie kennen den Wert von mode_key (zero) bereits, bevor Sie ihn einfügen, also 'promate' mode_key als den 'primären' Schlüssel :) – onedaywhen

+0

... oder gibt es einen Autoinkrement oder einen ähnlichen automatisch generierten Wert (z SQL Server IDENTITY) haben Sie uns nicht erzählt? – onedaywhen

Antwort

2

Sie werden nicht einen Weg finden, der in allen 3 db-Motoren funktioniert. Sie haben unterschiedliche Möglichkeiten, die ID der gerade eingefügten Zeile zu erhalten.

select scope_identity(); in SQL-Server.

In Oracle müssen Sie eine Sequenz verwenden und den Wert in der Tabelle selbst eingeben.

Informix

Also in Ihrem Code Sie wissen, gehen zu müssen, zu welcher Datenbank zur Zeit den erforderlichen Code zu verwenden, konfiguriert ist.

Eine andere Option ist, eine gespeicherte Prozedur die Einfügung zu tun, erhalten die ID eine Rückkehr zu Ihnen. Dann müssen Sie keine Änderungen an Ihrem Code vornehmen. Der Code ruft eine gespeicherte Prozedur auf, die die ID zurückgibt, aber Sie haben unterschiedliche Versionen der gespeicherten Prozedur für jede db-Engine mit jeweils demselben Namen und fügen sie in Ihre Skripts ein um Ihre Datenbank zu erstellen.

1

Unter der Annahme der DB ist ein SQLServer db, alles, was Sie tun müssen, ist:

SELECT SCOPE_IDENTITY(); 

Auch nicht verwenden:

SELECT @@IDENTITY; 

Es Übel ist. Ok, es ist nicht wirklich böse, aber es kann die ID, nach der Sie suchen, nicht zurückgeben, wenn Sie Trigger oder etwas anderes haben, das einen anderen Datensatz in Ihre Datenbank einfügen würde.

+0

Messing zielt auf 3 db-Engines mit dem gleichen Code. Dies funktioniert nur mit SQL Server. – jvanderh