Necesito una función que ejecute una instrucción INSERT en una base de datos y devuelva la clave primaria Auto_Increment. Tengo el siguiente código C# pero, aunque la instrucción INSERT funciona bien (puedo ver el registro en la base de datos, la PK se genera correctamente y filas == 1), el valor de identificación es siempre 0. Cualquier idea sobre lo que podría estar pasando ¿incorrecto?@@ IDENTIDAD después de la instrucción INSERT siempre devuelve 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();
}
En respuesta a las respuestas, he intentado:
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;
}
pero ahora estoy consiguiendo el error "Caracteres encontrado después del final de la instrucción SQL"
estoy usando un MS Access base de datos con conexión OleDb, Provider = Microsoft.Jet.OLEDB.4.0
Podría aclarar qué servidor de base de datos que está utilizando y, posiblemente, las referencias a inline InitializeAndOpenConnection/connection.CreateCommand ya que pueden afectar a nuestras respuestas ¿tú? :) – Rob
Además, el todo "SELECCIONAR OID FROM x donde OID = SCOPE_IDENTITY()" adelgaza es un tanto complejo como usted dice (para un registro insertado con un valor de identidad de 3): "SELECT 3 FROM table_x WHERE 3 = 3 "- un poco redundante – Rob
@Rob: puede parecer redundante, pero OID está escrito int, donde scope_identity() no lo es, por lo que puede convertir directamente (int) cmd.ExecuteScalar() – devio