1. ホーム
  2. c#

[解決済み】Dapperで挿入を実行し、挿入されたIDを返すにはどうすればよいですか?

2022-04-14 23:27:17

質問

Dapperでデータベースに挿入し、挿入したIDを返すにはどうしたらいいですか?

このようなことをやってみました。

string sql = "DECLARE @ID int; " +
             "INSERT INTO [MyTable] ([Stuff]) VALUES (@Stuff); " +
             "SELECT @ID = SCOPE_IDENTITY()";

var id = connection.Query<int>(sql, new { Stuff = mystuff}).First();

しかし、うまくいきませんでした。

Marc Gravellさん、返信ありがとうございます。 あなたの解決策を試しましたが、まだ同じ例外トレースは次のとおりです。

System.InvalidCastException: Specified cast is not valid

at Dapper.SqlMapper.<QueryInternal>d__a`1.MoveNext() in (snip)\Dapper\SqlMapper.cs:line 610
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in (snip)\Dapper\SqlMapper.cs:line 538
at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param) in (snip)\Dapper\SqlMapper.cs:line 456

解決方法は?

それは サポート 入出力パラメータ( RETURN の値)を使用する場合は DynamicParameters が、この場合、よりシンプルなオプションは単純です。

var id = connection.QuerySingle<int>( @"
INSERT INTO [MyTable] ([Stuff]) VALUES (@Stuff);
SELECT CAST(SCOPE_IDENTITY() as int)", new { Stuff = mystuff});

SQL Server の最近のバージョン (2005+) では OUTPUT 節があります。

var id = connection.QuerySingle<int>( @"
INSERT INTO [MyTable] ([Stuff])
OUTPUT INSERTED.Id
VALUES (@Stuff);", new { Stuff = mystuff});