Comment effectuer une insertion et renvoyer une identité insérée avec Dapper?

c# dapper sql-server

Question

Comment effectuer une insertion dans la base de données et renvoyer l'identité insérée avec Dapper?

J'ai essayé quelque chose comme ça:

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();

Mais ça n'a pas marché.

@Marc Gravell merci pour votre réponse. J'ai essayé votre solution mais, toujours la même trace d'exception est ci-dessous

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

Réponse acceptée

Il prend en charge les paramètres d'entrée / sortie (y compris la valeur de RETURN ) si vous utilisez DynamicParameters , mais dans ce cas, l'option la plus simple est simplement:

string sql = @"
INSERT INTO [MyTable] ([Stuff]) VALUES (@Stuff);
SELECT CAST(SCOPE_IDENTITY() as int)";

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

Réponse populaire

KB: 2019779 , "Vous pouvez recevoir des valeurs incorrectes lorsque vous utilisez SCOPE_IDENTITY () et @@ IDENTITY", La clause OUTPUT est le mécanisme le plus sûr:

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();



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi