13

此问题已在此处针对 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

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

编辑:

我已经设法通过以下方式完成这项工作:

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

也许不理想,但它有效。

4

3 回答 3

16

我将把这个留在这里,作为其他可能搜索这个问题的人的答案。

我已经设法通过以下方式完成这项工作:

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

也许不理想,但它有效。

于 2011-12-12T23:49:04.777 回答
9

我实际上可以对此进行一些额外的说明,因为我刚刚花了最后一个小时想知道为什么我的SELECT LAST_INSERT_ID()查询在一个 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<ulong>("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(signed)。

我最初的解决方案是将结果LAST_INSERT_ID()转换为未签名BIGINT的,以使代码在这两个服务器版本之间可移植,但是(惊喜,惊喜)MySQL 团队添加了一个障碍。

您不能使用该函数LAST_INSERT_ID()直接转换为无符号(甚至有符号) ,因为它不受支持。您可以转换为的唯一整数类型是和。这很痛苦,因为如果出于某种原因您真的需要一个自动递增的id 递增过去,那么无符号整数将不是一个足够大的类型来转换。BIGINTCAST()SIGNED INTEGERUNSIGNED INTEGERBIGINT4294967295

于 2014-01-23T09:22:05.503 回答
1

使用Convert.ToInt64(value)为我解决了它。

于 2014-06-19T11:58:43.920 回答