Lanzamiento inválido al devolver mysql LAST_INSERT_ID () usando dapper.net

c# dapper mysql

Pregunta

Esta pregunta se ha cubierto para MSSQL aquí:

¿Cómo realizo una inserción y regreso la identidad insertada con Dapper?

pero esta solución no funciona con mysql.

Para convertir el LAST_INSERT_ID() en un entero con mysql, tienes que hacer esto:

SELECT CAST(LAST_INSERT_ID() AS UNSIGNED INTEGER);

El seguimiento de la 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?

EDITAR:

Me las he arreglado para hacer que esto funcione con lo siguiente:

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

Tal vez no es ideal, pero funciona.

Respuesta aceptada

Dejaré esto aquí como una respuesta para cualquier otra persona que pueda buscar en este problema.

Me las he arreglado para hacer que esto funcione con lo siguiente:

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

Tal vez no es ideal, pero funciona.


Respuesta popular

De hecho, puedo arrojar algo de luz 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 BIGINT sin firmar, lo que significa que este código que funcionaba en mi servidor 5.5.31 funcionó:

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

... pero está roto cuando se ejecuta contra el servidor 5.5.11 anterior.

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 desde MySQL 5.5.29, BIGINT (firmado) antes de eso.

Mi solución inicial fue convertir el resultado de LAST_INSERT_ID() en un BIGINT sin firmar para hacer que el código sea portátil en ambas versiones del servidor, pero (sorpresa, sorpresa) el equipo de MySQL agregó una barricada.

No puede convertir LAST_INSERT_ID() directamente en BIGINT sin firmar (o incluso firmado) utilizando la función CAST() porque no es compatible. Los únicos tipos de enteros que puede convertir son SIGNED INTEGER y UNSIGNED INTEGER . Esto es un problema porque si por alguna razón realmente necesitas una ID BIGINT que se incrementa más allá de 4294967295 entonces un entero sin signo no será lo suficientemente grande como para convertirlo a.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué