【问题标题】:Invalid cast when returning mysql LAST_INSERT_ID() using dapper.net使用 dapper.net 返回 mysql LAST_INSERT_ID() 时强制转换无效
【发布时间】:2011-12-12 16:24:03
【问题描述】:

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

How do I perform an insert and return inserted identity with Dapper?

但此解决方案不适用于 mysql。

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

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();

也许不理想,但它有效。

【问题讨论】:

    标签: c# mysql dapper


    【解决方案1】:

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

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

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

    也许不理想,但它有效。

    【讨论】:

    • 遇到了同样的问题。由于某种原因,它不会使用 Dapper 转换为 int。您必须使用 long,而不是将其降级为 .net 中的 int :( 不知道这是否是 Connector、MySQL 或 Dapper 的错误。
    • 刚遇到同样的问题,发现它也返回了 ulong :)
    • 您可以先转换为 long 而不是 ulong,然后再转换为 int。我发现的另一个奇怪之处是 bit(1) 列也作为 UInt64 (ulong) 传递。我怀疑是司机。
    • 对不起...不是在这里跟踪你 :) 我发现另一个奇怪的事情是 CAST(LAST_INSERT_ID() AS UNSIGNED INTEGER)CAST(1 AS UNSIGNED INTEGER) 仍然转换为 64 位整数而不是 32 位整数的方式。希望 MySQL 大师结束 dba.SE 可以解释这种行为:dba.stackexchange.com/q/57363/2136
    【解决方案2】:

    我实际上可以对此进行一些额外的说明,因为我刚刚花了最后一个小时想知道为什么我的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

    从 MySQL 5.5.29 开始,该值的类型为 BIGINT UNSIGNED,在此之前为 BIGINT(已签名)。

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

    您不能使用CAST() functionLAST_INSERT_ID() 直接转换为未签名(甚至签名)的BIGINT,因为它不受支持。您可以转换为的唯一整数类型是SIGNED INTEGERUNSIGNED INTEGER。这很痛苦,因为如果出于某种原因您真的需要一个自动递增的 BIGINT id,它会递增到 4294967295 之后,那么无符号整数将不是一个足够大的类型来转换。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多