231 votes

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

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 la 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
 

57voto

jww Points 131

KB: 2019779 , "Il est possible que vous receviez 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();
 

7voto

bpruitt-goddard Points 1129

L'exception InvalidCastException que vous obtenez est due à SCOPE_IDENTITY étant un nombre décimal (38,0) .

Vous pouvez le retourner en tant qu'int en le lançant comme suit:

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

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

4voto

myty Points 31

Je ne suis pas sûr que ce soit parce que je travaille avec SQL 2000 ou non, mais je devais le faire pour que cela fonctionne.

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X