13

この質問は、MSSQLについてここで取り上げられています。

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

しかし、このソリューションはmysqlでは機能しません。

mysqlを使用してtoを整数にキャストするには、次の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();

おそらく理想的ではありませんが、機能します。

4

3 に答える 3

16

この問題を検索する可能性のある他の人への回答として、これをここに残しておきます。

私はこれを次のように機能させることができました:

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

おそらく理想的ではありませんが、機能します。

于 2011-12-12T23:49:04.777 に答える
9

SELECT LAST_INSERT_ID()クエリが1つのMySQLサーバーで機能し、別のサーバーでは機能しない理由を最後の1時間だけ考えたので、実際にこれにさらに光を当てることができます。1台のサーバーはMySQL5.5.11(本番)を実行しており、もう1台は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()私の最初の解決策は、結果をunsignedにキャストしてBIGINT、これらの両方のサーバーバージョン間でコードを移植できるようにすることでしたが、(驚いたことに、驚いたことに)MySQLチームは障害を追加しました。

この関数はサポートされていないため、この関数を使用しLAST_INSERT_ID()て署名されていない(または署名されている)ものに直接キャストすることはできません。キャストできる整数型はとだけです。なんらかの理由で、それを超えてインクリメントする自動インクリメントIDが本当に必要な場合、符号なし整数はキャストするのに十分な大きさではないため、これは苦痛です。BIGINTCAST()SIGNED INTEGERUNSIGNED INTEGERBIGINT4294967295

于 2014-01-23T09:22:05.503 に答える
1

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

于 2014-06-19T11:58:43.920 に答える