2011-12-15 50 views
8

Estoy usando MySql Connector .net, y necesito obtener el ID de inserción generado por la última consulta. Ahora, supongo que el valor de retorno de MySqlHelper.ExecuteNonQuery debe ser el último ID de inserción, pero sólo devuelve 1.ID de última inserción de MySql, Connector .net

El código que estoy usando es:

int insertID = MySqlHelper.ExecuteNonQuery(Global.ConnectionString, 
"INSERT INTO test SET var = @var", paramArray); 

Sin embargo insertID es siempre 1. He intentado crear una conexión MySQL y apertura/cierre manual, que dieron como resultado el mismo comportamiento

+0

1 significa que se ha insertado 1 registro. Para recuperar el insertID, necesita una consulta. – chance

+0

¿No se usa "SET" en ACTUALIZACIONES y no en inserciones? – jason

+0

Puede usarlo para ambos: http://dev.mysql.com/doc/refman/5.5/en/insert.html – Splatbang

Respuesta

1

1 es el de los registros efectuados por la consulta aquí sólo una fila se inserta por lo que no 1 vuelve

para obtener id de la fila insertada se debe utilizar scope_identity() en SQL Server y MySQL LAST_INSERT_ID() en

3

intenta utilizar esta consulta para obtener la última ID insertado -

SELECT LAST_INSERT_ID(); 

A continuación, ejecute el método para obtener DbCommand.ExecuteReader IDataReader -

command.CommandText = "SELECT LAST_INSERT_ID()"; 
IDataReader reader = command.ExecuteReader(); 

. ..y obtener información del lector -

if (reader != null && reader.Read()) 
    long id = reader.GetInt64(0); 

... no se olvide de cerrar el lector ;-)

+0

¡Gracias! Esa es la única forma de trabajar cuando se usa la transacción;) –

72

sólo tiene que utilizar el campo LastInsertedId

MySqlCommand dbcmd = _conn.CreateCommand(); 
dbcmd.CommandText = sqlCommandString; 
dbcmd.ExecuteNonQuery(); 
long imageId = dbcmd.LastInsertedId; 
+2

Esta es la respuesta correcta. Probado con [MySql/Connector] (http://dev.mysql.com/downloads/connector/net/) 6.3.8 – caligari

+0

De manera fácil, incluso probado por mí. Es correcto ! – Hatem

+0

Esta es una forma de hacerlo, ** pero no si necesita usar MySqlHelper.ExecuteNonQuery ** estrictamente. Una de las razones para usar MySqlHelper es cuando desea que el conector administre el grupo de conexiones y, como se indica en [documentos] (https: //dev.mysql.com/doc/connector-net/es/connector-net-programming-connection-pooling.html), un enfoque es utilizar las sobrecargas api que no toman un nuevo objeto MySqlConnection como parámetro, sino que el administrador gestiona su la creación misma. Entonces esta no es una solución para tales casos (míos). – Veverke

2

que tenía el mismo problema, y ​​después de algunas pruebas, descubrí que el problema parece ser el método de conexión; estás usando una cadena de conexión.

Esto es, por supuesto, para hacer uso de la reutilización del grupo de conexión automática, pero en este caso me dio problemas.

La solución final para mí es crear una nueva conexión, ejecutar la consulta de inserción y luego ejecutar last_insert_id(). En el misma conexión.

Sin utilizar la misma conexión, last_insert_id() puede devolver algo, no sé por qué, pero supongo que pierde el seguimiento de las cosas, ya que pueden ser conexiones diferentes.

Ejemplo:

MySqlConnection connection = new MySqlConnection(ConnectionString); 
connection.Open(); 

int res = MySqlHelper.ExecuteNonQuery(
    connection, 
    "INSERT INTO games (col1,col2) VALUES (1,2);"); 

object ores = MySqlHelper.ExecuteScalar(
connection, 
"SELECT LAST_INSERT_ID();"); 

if (ores != null) 
{ 
    // Odd, I got ulong here. 
    ulong qkwl = (ulong)ores; 
    int Id = (int)qkwl; 
} 

espero que esto ayude a alguien!

Cuestiones relacionadas