Distribution invalide lors du retour de mysql LAST_INSERT_ID () à l'aide de dapper.net

c# dapper mysql

Question

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.

Réponse acceptée

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.


Réponse populaire

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 .




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi