Ich brauche eine Funktion, die eine INSERT-Anweisung für eine Datenbank ausführt und den Primärschlüssel Auto_Increment zurückgibt. Ich habe den folgenden C# -Code aber, während die INSERT-Anweisung gut funktioniert (ich kann den Datensatz in der Datenbank sehen, der PK wird korrekt generiert und Zeilen == 1), der ID-Wert ist immer 0. Irgendwelche Ideen auf was gehen könnte falsch?@@ IDENTITY nach INSERT-Anweisung gibt immer 0
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();
}
Als Reaktion auf Antworten, habe ich 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 den Fehler „Zeichen nach dem Ende der SQL-Anweisung gefunden“
Ich verwende eine MS Access bekommen Datenbank mit OleDb Verbindung, Provider = Microsoft.Jet.OLEDB.4.0
Können Sie klären, welche Datenbankserver verwenden und Inline möglicherweise die Verweise auf InitializeAndOpenConnection/connection.CreateCommand wie sie unsere Antworten beeinflussen können Du? :) – Rob
Auch - die ganze "SELECT OID FROM x wo OID = SCOPE_IDENTITY()" Thins ist etwas zu komplex, wie Sie sagen (für einen Datensatz mit einem Identity-Wert von 3 eingefügt): "SELECT 3 FROM table_x WHERE 3 = 3 "- irgendwie redundant – Rob
@Rob: Es mag redundant erscheinen, aber OID ist Int eingegeben, wo scope_identity() nicht ist, so können Sie direkt (Int) Cmd.ExecuteScalar() – devio