dapper.netを使用してmysql LAST_INSERT_ID()を返すときの無効なキャスト

c# dapper mysql

質問

この質問は、ここではMSSQLでカバーされています:

Dapperを使用して挿入を実行し、挿入されたIDを返すにはどうすればよいですか?

この解決策は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()クエリが1つのMySQLサーバで動作したのか、別のMySQLサーバで動作していないのか疑問に思ってしまったので、私は実際にこのことについていくつか追加しました。 1台のサーバでMySQL 5.5.11(プロダクション)ともう1台の5.5.31(ローカルデベロッパ)が稼働しています。

バージョン5.1.67,5.5.29,5.6.9より前(それぞれのリリースで)、 LAST_INSERT_ID()は符号付き整数を返すために使用されました。

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

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

この値の前には、MySQL 5.5.29のBIGINT (署名済み)のBIGINT UNSIGNED型があります。

私の最初の解決策は、 LAST_INSERT_ID()結果を符号なしBIGINTにキャストして、両方のサーバーバージョン間でコードを移植可能にすることでしたが、MySQLチームがロードブロッキングを追加しました(驚き)。

LAST_INSERT_ID()は、サポートされていないため、 CAST()関数を使用して符号なし(または符号付き)のBIGINT直接キャストできません。キャストできる整数型は、 SIGNED INTEGERUNSIGNED INTEGERです。何らかの理由で実際に4294967295を超えて増分する自動増分BIGINT idが必要な場合、符号なし整数はキャストするのに十分な大きさの型ではないため、これは苦痛です。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow