[英]Invalid cast when returning mysql LAST_INSERT_ID() using dapper.net
MSSQL在這里已經涵蓋了這個問題:
但是這個解決方案不適用於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 INTEGER
和UNSIGNED INTEGER
的唯一整數類型。 這是一種痛苦,因為如果由於某種原因你真的需要一個自動遞增的BIGINT
id,它增加超過4294967295
那么無符號整數將不會是一個足夠大的類型來強制轉換。
使用Convert.ToInt64(value)
為我解決了這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.