Dapper obtenir "casting spécifié n'est pas valide." pour la valeur du paramètre ReturnValue

c# dapper stored-procedures

Question

J'essaie d'utiliser SCOPE_IDENTITY pour retourner une clé primaire longue à c # en utilisant l'option ReturnValue pour DynamicParameter.

Voici un exemple de code du site Web Dapper:

var p = new DynamicParameters();
p.Add("@a", 11);
p.Add("@b", dbType: DbType.Int32, direction: ParameterDirection.Output);
p.Add("@c", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);

cnn.Execute("spMagicProc", p, commandType: commandType.StoredProcedure); 

int b = p.Get<int>("@b");
int c = p.Get<int>("@c");

Au lieu de retourner int, je préférerais faire ce qui suit car mon champ de clé primaire devrait être bigint

var p = new DynamicParameters();
p.Add("@a", 11);
p.Add("@b", dbType: DbType.Int32, direction: ParameterDirection.Output);
p.Add("@c", dbType: DbType.Int64, direction: ParameterDirection.ReturnValue);

cnn.Execute("spMagicProc", p, commandType: commandType.StoredProcedure); 

int b = p.Get<int>("@b");
int c = p.Get<long>("@c");

Dans mon proc, j'utilise "RETURN SCOPE_IDENTITY ()".

Cependant, cela semble donner lieu à une "distribution spécifiée n'est pas valide". exception.

Réponse acceptée

La valeur de retour d'une procédure stockée est toujours implicitement un entier, c'est-à-dire int . En tant que tel, vous ne pouvez le traiter que comme un entier. Si vous essayez de le désinstaller aussi long , cela échouera.

Options:

  • si la valeur convient, traitez-la simplement comme int dans le côté .NET
  • sinon, utilisez un paramètre out de type bigint et traitez-le aussi long du côté .NET
  • ou utilisez select et Query<long>(...).Single()

Réponse populaire

Si je me souviens bien, SCOPE_IDENTITY () renvoie une décimale ( http://msdn.microsoft.com/en-us/library/ms190315.aspx ), d'où l'exception de conversion invalide.

Vous devez le convertir en bigint (dans le SQL) pour qu'il fonctionne comme vous le souhaitez.



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