Wie führe ich eine Einfügung in die Datenbank durch und gebe die eingefügte Identität mit Dapper zurück?
Ich habe so etwas versucht:
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();
Aber es hat nicht funktioniert.
@Marc Gravell danke, für die Antwort. Ich habe deine Lösung versucht, aber immer noch die gleiche Ausnahme-Trace ist unten
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
Es unterstützt Eingabe / Ausgabe-Parameter (einschließlich RETURN
Wert), wenn Sie DynamicParameters
, aber in diesem Fall ist die einfachere Option einfach:
string sql = @"
INSERT INTO [MyTable] ([Stuff]) VALUES (@Stuff);
SELECT CAST(SCOPE_IDENTITY() as int)";
var id = connection.Query<int>(sql, new { Stuff = mystuff}).Single();
KB: 2019779 , "Sie können falsche Werte erhalten, wenn Sie SCOPE_IDENTITY () und @ IDENTITY" verwenden Die OUTPUT-Klausel ist der sicherste Mechanismus:
string sql = @"
DECLARE @InsertedRows AS TABLE (Id int);
INSERT INTO [MyTable] ([Stuff]) OUTPUT Inserted.Id INTO @InsertedRows
VALUES (@Stuff);
SELECT Id FROM @InsertedRows";
var id = connection.Query<int>(sql, new { Stuff = mystuff}).Single();