簡體   English   中英

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

[英]Invalid cast when returning mysql LAST_INSERT_ID() using dapper.net

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那么無符號整數將不會是一個足夠大的類型來強制轉換。

使用Convert.ToInt64(value)為我解決了這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM