Cette question a été traitée pour MSSQL ici:
Comment effectuer une insertion et renvoyer une identité insérée avec Dapper?
mais cette solution ne fonctionne pas avec mysql.
Pour LAST_INSERT_ID()
le LAST_INSERT_ID()
en entier avec mysql, LAST_INSERT_ID()
comme LAST_INSERT_ID()
:
SELECT CAST(LAST_INSERT_ID() AS UNSIGNED INTEGER);
La trace de la pile est:
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
Quelqu'un at-il résolu ce problème dans MySQL?
MODIFIER:
J'ai réussi à faire ce travail avec les éléments suivants:
var id = connection.Query<ulong>("SELECT CAST(LAST_INSERT_ID() AS UNSIGNED INTEGER);").Single();
Peut-être pas idéal, mais ça marche.
Je vais laisser ceci ici comme une réponse à quiconque pourrait chercher sur ce problème.
J'ai réussi à faire ce travail avec les éléments suivants:
var id = connection.Query<ulong>("SELECT CAST(LAST_INSERT_ID() AS UNSIGNED INTEGER);").Single();
Peut-être pas idéal, mais ça marche.
Je peux en fait apporter quelques éclaircissements à ce sujet car je viens de passer la dernière heure à me demander pourquoi ma SELECT LAST_INSERT_ID()
fonctionnait sur un serveur MySQL, mais pas sur un autre. Un serveur exécute MySQL 5.5.11 (production) et l’autre 5.5.31 (dev local).
Avant les versions 5.1.67, 5.5.29 et 5.6.9 (dans chaque version respective), LAST_INSERT_ID()
utilisé pour renvoyer un entier signé.
Maintenant, LAST_INSERT_ID()
retourne un BIGINT
non BIGINT
qui signifie que ce code qui fonctionnait sur mon serveur 5.5.31 fonctionnait:
var id = cn.Query<ulong>("SELECT LAST_INSERT_ID();").First();
... mais est cassé lorsqu'il est exécuté sur l'ancien serveur 5.5.11.
C'est documenté ici:
http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_last-insert-id
La valeur a un type de
BIGINT UNSIGNED
partir de MySQL 5.5.29,BIGINT
(signé) avant cela.
Ma solution initiale consistait à LAST_INSERT_ID()
le résultat de LAST_INSERT_ID()
en BIGINT
non BIGINT
pour rendre le code portable sur ces deux versions de serveur, mais (surprise, surprise), l'équipe MySQL a ajouté un roadblock.
Vous ne pouvez pas lancer LAST_INSERT_ID()
directement à un (ou même signé) non signé BIGINT
en utilisant la CAST()
fonction parce qu'il est pas pris en charge. Les seuls types d'entiers sur UNSIGNED INTEGER
vous pouvez lancer sont SIGNED INTEGER
et UNSIGNED INTEGER
. C'est un problème car si, pour une raison quelconque, vous avez vraiment besoin d'un identifiant BIGINT
incrémenté BIGINT
qui passe au-delà de 4294967295
un entier non signé ne sera pas assez grand pour être BIGINT
.