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

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

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

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

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

SELECT CAST(LAST_INSERT_ID() AS UNSIGNED INTEGER);

堆栈跟踪是:

 Dapper.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 

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

编辑:

我已成功完成以下工作:

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

也许并不理想,但它确实有效。

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

我已成功完成以下工作:

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

也许并不理想,但它确实有效。

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

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

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

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

…但是对旧的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()的结果转换为未签名的BIGINT以使代码可以跨这两个服务器版本移植,但是(惊讶,惊讶)MySQL团队添加了一个障碍。

您不能使用CAST()函数将LAST_INSERT_ID()直接转换为无符号(甚至已签名) BIGINT ,因为它不受支持。 您可以强制转换为SIGNED INTEGERUNSIGNED INTEGER的唯一整数类型。 这是一种痛苦,因为无论出于何种原因,你真的需要一个自动递增的BIGINT id,它增加超过4294967295那么无符号整数将不会是一个足够大的类型来强制转换。

使用Convert.ToInt64(value)为我解决了这个问题。