@@IDENTITY after INSERT-Anweisung gibt immer 0 zurück
Brauche ich eine Funktion, die führt eine INSERT-Anweisung auf eine Datenbank und gibt den Auto_Increment primary key. Ich habe folgenden C# code, aber, während die INSERT-Anweisung funktioniert gut (ich kann sehen, dass der Datensatz in der Datenbank der PK richtig erzeugt wird und rows == 1), wird der id-Wert ist immer 0. Irgendwelche Ideen auf, was könnte schief gehen?
public int ExecuteInsertStatement(string statement)
{
InitializeAndOpenConnection();
int id = -1;
IDbCommand cmdInsert = connection.CreateCommand();
cmdInsert.CommandText = statement;
int rows = cmdInsert.ExecuteNonQuery();
if (rows == 1)
{
IDbCommand cmdId = connection.CreateCommand();
cmdId.CommandText = "SELECT @@Identity;";
id = (int)cmdId.ExecuteScalar();
}
return id;
}
private void InitializeAndOpenConnection()
{
if (connection == null)
connection = OleDbProviderFactory.Instance.CreateConnection(connectString);
if(connection.State != ConnectionState.Open)
connection.Open();
}
In der Antwort zu Antworten, ich habe versucht:
public int ExecuteInsertStatement(string statement, string tableName)
{
InitializeAndOpenConnection();
int id = -1;
IDbCommand cmdInsert = connection.CreateCommand();
cmdInsert.CommandText = statement + ";SELECT OID FROM " + tableName + " WHERE OID = SCOPE_IDENTITY();";
id = (int)cmdInsert.ExecuteScalar();
return id;
}
aber ich bin jetzt immer die Fehlermeldung "Zeichen nach Ende von SQL-Anweisung"
Verwende ich eine MS Access-Datenbank mit OLE DB Verbindung, Provider=Microsoft.Jet.OLEDB.4.0
InformationsquelleAutor der Frage Gillian | 2008-10-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
1) verbinden Sie den INSERT-und SELECT-Anweisung (verkettet mit ";") in 1 db-Befehl
2) verwenden Sie SCOPE_IDENTITY() statt @@IDENTITY
INSERT INTO blabla... ; SELECT OID FROM table WHERE OID = SCOPE_IDENTITY()
-- update:
als es stellte sich heraus, dass die Frage im Zusammenhang mit MS ACCESS, fand ich dieser Artikel was darauf hindeutet, dass Sie einfach die Wiederverwendung der erste Befehl und die Einstellung seiner CommandText "SELECT @@IDENTITY" sollte ausreichend sein.
InformationsquelleAutor der Antwort devio
Microsoft.Jet.OLEDB.4.0-Anbieter unterstützt die Jet v3 und Jet v4-Datenbank-engines, allerdings
SELECT @@IDENTITY ist nicht unterstützt für Jet v3.
MSAccess 97 Jet v3 und unterstützt nicht die SELECT @@IDENTITY; Es unterstützt auf MSAccess 2000 und höher.
InformationsquelleAutor der Antwort Adrian
Sind Sie mit Jet (nicht SQL Server) und Jet können nur mit einer SQL-Anweisung pro Befehl, daher müssen Sie ausführen
SELECT @@IDENTITY
in einem separaten Befehl, der offensichtlich sicherstellen, dass er benutzt die gleiche Verbindung wie dieINSERT
.InformationsquelleAutor der Antwort onedaywhen
müssen Sie zurück die Identität zur gleichen Zeit, wie Sie Sie öffnen der ersten Verbindung.
Ergebnis aus der insert-oder eine output-variable.
Sollten Sie auch immer verwenden, SCOPE_IDENTITY () @@identity. Referenz hier
Sollten Sie
Nach dem insert.
InformationsquelleAutor der Antwort evilhomer
Ich denke, du musst die Select @@identity mit der ersten create-Befehl - versuchen Sie es via ";SELECT @@Identity" und .ExecuteScalar-die insert-Anweisung
InformationsquelleAutor der Antwort Richard Harrison
Gibt es alle Trigger auf die Tabelle, könnte sein einfügen in andere Tabellen? In der Regel sind wir von denen abgeraten wird Verwendung von @@Identity zugunsten der IDENT_CURRENTso dass Sie garantieren können, dass die Identität zurückgegeben werden, ist für die Tabelle, die Sie gerade eingefügt.
InformationsquelleAutor der Antwort Matt Hamilton
Ich denke, dass @@identity ist nur gültig im Geltungsbereich der-Befehl - in Ihrem Fall wenn Sie execute "- Anweisung".
Ändern Sie Ihre "Aussage", so dass die gespeicherte Prozedur selbst zurück, @@IDENTITY-Wert direkt nach der INSERT-Anweisung, und Lesen Sie es als Rückgabe-code, der die Ausführung der gespeicherten Prozedur.
InformationsquelleAutor der Antwort ila
Überprüfen Sie Ihre Datenbank-Einstellungen. Ich hatte ein ähnliches problem vor einer Weile, und entdeckt, dass die SQL Server-Verbindung die Einstellung "no count" aktiviert war.
In SQL Server Management Studio finden Sie dies durch Rechtsklick auf den server im Objekt-Explorer, wählen Sie Eigenschaften, und navigieren Sie dann zu der Seite Verbindungen. Schauen Sie sich die Einstellungen für "Standard-Anschluss-Optionen"
InformationsquelleAutor der Antwort Geir-Tore Lindsve
Sind nicht die meisten der Beantworter zu vergessen, dass der Fragesteller ist nicht mit SQL Server?
Offenbar, MS Access 2000 und höher nicht support @@IDENTITY.Die alternative ist "Mit dem RowUpdated-Ereignis können Sie bestimmen, ob ein EINFÜGEN stattgefunden hat, um die neueste @@IDENTITY-Wert, und Ort, der in die identity-Spalte der lokalen Tabelle im DataSet."Und ja, dies ist für eingebettete VBA im Access-DB. Das ist immer noch aufrufbar außerhalb von Access über die Access-Objekt Bibliothek.
Edit: ok, es wird unterstützt, sorry für die groggy am frühen morgen beantworten. Aber der rest dieser Antwort helfen könnte.
InformationsquelleAutor der Antwort moffdub
Wenn Sie möchten, abrufen, Wert von auto, mit der Nummer der Transaktion, die Sie einsetzen und Ihre Umwelt nach
1. Datenbank MsAccess.
2. Treiber ist Jet4 mit connection-string "Provider=Microsoft.Jet.OLEDB.4.0;Password={0};Data Source={1};Persist Security Info=True"
3. verwenden Sie Oledb -
Bewerben können Sie sich mein Beispiel-code
InformationsquelleAutor der Antwort Fuangwith S.
Die kurze Antwort:
1. Erstellen Sie zwei Befehle, die jeweils die Annahme einer einzigen Abfrage.
2. Erste sql-query zum EINFÜGEN des Datensatzes.
3. Zweite sql-Abfrage "SELECT @@Identity;" der gibt den AutoWert.
4. Verwenden Sie den Befehl cmd ein.ExecuteScalar() liefert eine erste Spalte der ersten Zeile.
5. Die Ergebnis-Ausgabe ist der AutoWert-Wert generiert, der die aktuelle insert-Abfrage.
Es wird verwiesen von diesem link. Der Beispiel code ist unter. Beachten Sie den Unterschied zum "GLEICHEN Anschluss VS NEUE Verbindung". Den GLEICHEN Zusammenhang gibt die gewünschte Ausgabe.
Diese erzeugen soll, die selbsterklärend Ausgabe:
InformationsquelleAutor der Antwort user1943915
Als Sie mit Access, werfen Sie einen Blick auf dieser Artikel von aspfaq, scrollen Sie nach unten bis etwa auf halbem Weg unten auf der Seite. Der code ist in der klassischen ASP -, sondern hoffentlich auch die Grundsätze sollten auch heute noch stehe.
SELECT @@Identity enden, die oben behandelt, als eine separate Ausführung der Zusammenhang, glaube ich. Code, der sollte Arbeit wäre:
Würden Sie wahrscheinlich wollen/müssen, um aufzuräumen die Verkettung fügt hinzu, dass die 'SELECT @@Identity" wird an das Ende des Codes aber.
InformationsquelleAutor der Antwort Rob
InformationsquelleAutor der Antwort imam kuncoro