使用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 INTEGER
和UNSIGNED INTEGER
的唯一整数类型。 这是一种痛苦,因为无论出于何种原因,你真的需要一个自动递增的BIGINT
id,它增加超过4294967295
那么无符号整数将不会是一个足够大的类型来强制转换。
使用Convert.ToInt64(value)
为我解决了这个问题。