使用dapper.net返回mysql LAST_INSERT_ID()时无效的强制转换

Chr*_*s W 13 c# mysql dapper

MSSQL在这里已经涵盖了这个问题:

如何使用Dapper执行插入并返回插入的标识?

但是这个解决方案不适用于mysql.

LAST_INSERT_ID()使用mysql转换为整数,您必须这样做:

SELECT CAST(LAST_INSERT_ID() AS UNSIGNED INTEGER);

堆栈跟踪是:

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
Run Code Online (Sandbox Code Playgroud)

有没有人在MySQL中解决这个问题?

编辑:

我已成功完成以下工作:

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

也许不理想,但它的确有效.

Chr*_*s W 16

我会留下这个作为其他任何可能搜索此问题的人的答案.

我已成功完成以下工作:

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

也许不理想,但它的确有效.


Kev*_*Kev 8

我实际上可以对此有所了解,因为我花了最后一小时才想知道为什么我的SELECT LAST_INSERT_ID()查询在一台MySQL服务器上工作但不在另一台MySQL服务器上工作.一台服务器运行MySQL 5.5.11(生产),另一台运行5.5.31(本地开发).

LAST_INSERT_ID()用于返回有符号整数的版本5.1.67,5.5.29和5.6.9(在每个相应版本中)之前.

现在LAST_INSERT_ID()返回一个unsigned BIGINT,这意味着在我的5.5.31服务器上工作的代码工作:

var id = cn.Query<ulong>("SELECT LAST_INSERT_ID();").First();
Run Code Online (Sandbox Code Playgroud)

...但是对旧的5.5.11服务器执行时会损坏.

它在这里记录:

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

该值的类型BIGINT UNSIGNED为MySQL 5.5.29,BIGINT(之前签名).

我最初的解决方案是将结果LAST_INSERT_ID()转换为unsigned BIGINT以使代码在这两个服务器版本中都可移植,但是(惊讶,惊讶)MySQL团队添加了一个障碍.

您不能使用该函数LAST_INSERT_ID()直接转换为无符号(甚至是已签名)BIGINT,因为它不受支持.您可以强制转换为的唯一整数类型是和.这是一种痛苦,因为如果由于某种原因你真的需要一个增量过去的自动递增id,那么无符号整数将不会是一个足够大的类型来强制转换.CAST()SIGNED INTEGERUNSIGNED INTEGERBIGINT4294967295