2011-12-12 12 views
12

Esta pregunta ha sido cubierto para MSSQL aquí:fundido no válida al volver LAST_INSERT_ID mysql() usando dapper.net

How do I perform an insert and return inserted identity with Dapper?

pero esta solución no funciona con MySQL.

a emitir el LAST_INSERT_ID() a entero con MySQL que tiene que hacer esto:

SELECT CAST(LAST_INSERT_ID() AS UNSIGNED INTEGER);

El seguimiento de pila es:

Dapper.<QueryInternal>d__13`1.MoveNext() in sqlMapper.cs:607 
    System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +159 
    System.Linq.Enumerable.ToList(IEnumerable`1 source) +36 
    Dapper.SqlMapper.Query(IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in sqlMapper.cs:535 

Alguien ha resuelto este problema en MySQL?

EDIT:

he conseguido hacer este trabajo con lo siguiente:

var id = connection.Query<ulong>("SELECT CAST(LAST_INSERT_ID() AS UNSIGNED INTEGER);").Single(); 

Quizás no es ideal, pero funciona.

Respuesta

14

Lo dejo aquí como una respuesta para cualquier persona que pueda buscar en este problema.

He conseguido hacer este trabajo con lo siguiente:

var id = connection.Query<ulong>("SELECT CAST(LAST_INSERT_ID() AS UNSIGNED INTEGER);").Single(); 

Quizás no es ideal, pero funciona.

+0

Estaba teniendo el mismo problema. Por alguna razón, no se lanzará a un int usando Dapper. Tienes que usar long, que degradarlo a un int en .net :(No sé si es un error con el Connector, MySQL o Dapper. – Sam

+0

Acabo de recibir el mismo problema y descubrí que también regresó:) –

+1

Puedes lanzar tanto tiempo en lugar de ulong y luego int. Otra rareza que encontré es que las columnas de bit (1) también se pasan como UInt64 (ulong). Mi sospecha es el conductor. –

7

Realmente puedo arrojar algo de luz adicional sobre esto porque acabo de pasar la última hora preguntándome por qué mi consulta SELECT LAST_INSERT_ID() funcionó en un servidor MySQL pero no en otro. Un servidor ejecuta MySQL 5.5.11 (producción) y el otro 5.5.31 (desarrollador local).

Antes de las versiones 5.1.67, 5.5.29 y 5.6.9 (en cada versión respectiva) LAST_INSERT_ID() solía devolver un entero con signo.

Ahora LAST_INSERT_ID() devuelve un sin firmar BIGINT lo que significaba el código que funcionó en mi servidor 05/05/31 trabajaron:

var id = cn.Query<ulong>("SELECT LAST_INSERT_ID();").First(); 

... pero se rompe cuando se ejecuta contra el viejo servidor 5.5.11.

Está documentado aquí:

http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_last-insert-id

El valor tiene un tipo de BIGINT UNSIGNED partir de MySQL 5.5.29, BIGINT (firmado) antes de eso.

Mi solución inicial era emitir el resultado de LAST_INSERT_ID() a un sin firmar BIGINT para hacer que el código portable entre estas dos versiones de servidor pero (sorpresa, sorpresa) el equipo de MySQL añaden un control de carretera.

No puede convertir LAST_INSERT_ID() directamente en un BIGINT sin firmar (o incluso firmado) utilizando CAST() function porque no es compatible. Los únicos tipos de entero que puede convertir son SIGNED INTEGER y UNSIGNED INTEGER. Esto es un problema porque si por alguna razón realmente necesita un auto incrementando BIGINT id que incrementa el pasado 4294967295, entonces un entero sin signo no será lo suficientemente grande como para convertirlo.

1

El uso de Convert.ToInt64(value) lo resolvió para mí.

Cuestiones relacionadas