2011-12-12 14 views
12

を使用して)(MySQLのLAST_INSERT_IDを返すとき、この問題は、ここでMSSQLのためにカバーされています無効なキャストdapper.net

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では、この問題を解決しましたか?

EDIT:

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にキャストしません。あなたは、それをintにダウングレードするよりも長い時間を使う必要があります:(それはConnector、MySQL、またはDapperのバグかどうかわかりません) – Sam

+0

ちょうど同じ問題があり、 ) –

+1

ulongとintの代わりにlongキャストすることができます。私が見つけたもう一つの奇妙な点は、ビット(1)の列がUInt64(ulong)として渡されていることです。私の疑惑は運転手です。 –

7

私はちょうど私のSELECT LAST_INSERT_ID()クエリは1台のMySQLサーバではなく、他に働いた理由を疑問に思う最後の時間を過ごしたので、私は実際にこの上でいくつかの追加の光を当てることができます。 1台のサーバでMySQL 5.5.11(プロダクション)ともう1台の5.5.31(ローカルデベロッパ)が稼働しています。

(各リリースの)バージョン5.1.67、5.5.29および5.6.9 LAST_INSERT_ID()の前に符号付き整数を返すために使用されます。

var id = cn.Query<ulong>("SELECT LAST_INSERT_ID();").First(); 

を...しかし、古い5.5.11サーバーに対して実行時に壊れている:

LAST_INSERT_ID()は私5.5.31サーバー上で働いていたこのコードを意味し、符号なしBIGINTが働いて返します。

それはここに文書化されています:

http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_last-insert-id

値は、その前にBIGINT(署名)のMySQL 5.5.29、のようBIGINT UNSIGNEDの種類があります。

私の最初のソリューションは、これらの両方のサーバーのバージョン間でコードの移植を行うために、符号なしBIGINTLAST_INSERT_ID()の結果をキャストすることでしたが、(驚き、驚きは)MySQLのチームがバリケードを追加しました。

LAST_INSERT_ID()は、BIGINTには対応していないため、CAST() functionを使用して直接符号なし(または署名済み)にキャストすることはできません。キャストできる整数型は、SIGNED INTEGERUNSIGNED INTEGERです。これは痛みです。何らかの理由で実際に4294967295をインクリメントするBIGINT IDをインクリメントする自動が必要な場合、符号なし整数はキャストするのに十分な大きさではありません。

1

Convert.ToInt64(value)の使用は私のためにそれを解決しました。

関連する問題