使用dapper.net返回mysql LAST_INSERT_ID()時無效的強制轉換

c# dapper mysql

MSSQL在這裡已經涵蓋了這個問題:

如何使用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();

也許並不理想,但它確實有效。

一般承認的答案

我會留下這個作為其他任何可能搜索此問題的人的答案。

我已成功完成以下工作:

var id = connection.Query<ulong>("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<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 (簽名)。

我最初的解決方案是將LAST_INSERT_ID()的結果轉換為未簽名的BIGINT以使代碼可以跨這兩個服務器版本移植,但是(驚訝,驚訝)MySQL團隊添加了一個障礙。

您不能使用CAST()函數LAST_INSERT_ID()直接轉換為無符號(甚至已簽名) BIGINT ,因為它不受支持。您可以強制轉換為SIGNED INTEGERUNSIGNED INTEGER的唯一整數類型。這是一種痛苦,因為無論出於何種原因,你真的需要一個自動遞增的BIGINT id,它增加超過4294967295那麼無符號整數將不會是一個足夠大的類型來強制轉換。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因