Dapper NullReferenceException

c# dapper sql

Question

Je reçois une exception NullReferenceException lorsque j'exécute ce code:

var insertTransaction = @"INSERT INTO [192.168.1.55].databaseName.dbo.tableName
(Date, Desc) 
VALUES(GETDATE(), 
@Description)
SELECT Scope_identity()";

var result = _sqlMapper.Query<int>(insertTransaction,
             new
             {                           
                 Description = "some description"
             });

où _sqlMapper est une instance de Dapper.SqlMapper

Si je supprime SELECT Scope_identity() je ne reçois pas l'exception.

La trace de la pile d'exception indique que l'exception est lancée ici:

at Dapper.SqlMapper.d__11`1.MoveNext () dans d: \ Dev \ dapper-dot-net \ Dapper NET40 \ SqlMapper.cs: ligne 1583

  1. Pourquoi SELECT Scope_identity() crée-t-il un objet nul et comment le réparer?
  2. Pourquoi la trace de pile affiche-t-elle un chemin de fichier qui n'existe pas sur mon ordinateur local?

MISE À JOUR: version Dapper = 1.40.0.0, version d'exécution = v4.0.30319 DLL = C: \ src \ packages \ Dapper.1.40 \ lib \ net45 \ Dapper.dll

UPDATE: Si j'exécute la requête dans Management Studio, la ligne est insérée, mais la valeur renvoyée de scope_identity est null.

Réponse acceptée

Scope_identity ne fonctionnera pas sur les serveurs distants / liés. Voir la réponse suivante pour une solution: Meilleure façon d'obtenir l'identité de la ligne insérée dans le serveur lié?

Ma méthode préférée:

 SELECT *
 FROM OPENQUERY(server, '
     INSERT INTO database.schema.table (columns) VALUES (values);
     SELECT SCOPE_IDENTITY() AS ID');

Notez également que SCOPE_IDENTITY() donne une décimale et non un int. Et Dapper.SqlMapper.Query renverra un IEnumerable , il existe une méthode ExecuteScalar depuis 1.28.

N'oubliez pas de noter la réponse dans le lien si cela vous a aidé.


Réponse populaire

vous obtenez l'exception en utilisant dapper et Management Studio car les deux sont dans la même étendue. Lorsque vous sélectionnez SELECT SCOPE_IDENTITY() , il y a deux instructions de même portée, vous obtenez donc toujours NullReferenceException

Si vous séparez l'instruction SQL du point-virgule, cela devrait fonctionner

var insertTransaction = @"INSERT INTO [192.168.1.55].databaseName.dbo.tableName
(Date, Desc) 
VALUES(GETDATE(), 
@Description);
SELECT Scope_identity()";


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