2011-12-12 48 views
12

這個問題返回MySQL的LAST_INSERT_ID()時,已經覆蓋了MSSQL的位置:投無效使用dapper.net

How do I perform an insert and return inserted identity with 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(); 

也許並不理想,但它的工作原理。

回答

14

在這裏我要離開這個爲別人誰可能在這個問題上尋求答案。

我設法與以下這些工作:

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

也許並不理想,但它的工作原理。

+0

發生同樣的問題。出於某種原因,它不會使用Dapper轉換爲int。你必須使用很長的時間,而不是將它降級到.net :(不知道它是否是連接器,MySQL或Dapper的錯誤 – Sam

+0

剛剛得到同樣的問題,發現它也返回了ulong: ) –

+1

你可以投入很長時間而不是ulong然後int。我發現的另一個奇怪之處在於,第(1)列也以UInt64(ulong)的形式傳遞。我懷疑是司機。 –

7

其實我可以提供一些線索這額外的光,因爲我剛剛花了近一個小時是否爲什麼我的SELECT LAST_INSERT_ID()查詢一個MySQL服務器而不是另一個上工作。一臺服務器運行MySQL 5.5.11(生產),另一臺5.5.31(本地開發)。

在此之前用於返回一個帶符號的整數的版本67年5月1日,和5.5.29 5.6.9(在每個相應的釋放)LAST_INSERT_ID()

現在LAST_INSERT_ID()返回unsigned BIGINT這意味着這個代碼,我31年5月5日的服務器上工作的工作:

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() functionLAST_INSERT_ID()直接轉換爲無符號(甚至有符號)BIGINT,因爲它不受支持。您可以投入的唯一整數類型是SIGNED INTEGERUNSIGNED INTEGER。這是一個痛苦,因爲如果出於某種原因,你確實需要一個自動遞增的BIGINT id,它會增加4294967295,那麼一個無符號整數將不會是一個足夠大的類型來投射。

1

使用Convert.ToInt64(value)爲我解決了它。