Dapper obtiene "El lanzamiento especificado no es válido". para el valor del parámetro ReturnValue

c# dapper stored-procedures

Pregunta

Intento usar SCOPE_IDENTITY para devolver una clave primaria larga a c # utilizando la opción ReturnValue para DynamicParameter.

Aquí hay un código de muestra del sitio web de 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");

En lugar de regresar int, preferiría hacer lo siguiente ya que mi campo de clave principal debería ser 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");

En mi proceso, estoy usando "RETURN SCOPE_IDENTITY ()".

Sin embargo, hacer esto parece dar como resultado un "lanzamiento especificado no es válido". excepción.

Respuesta aceptada

El valor de retorno de un procedimiento almacenado siempre es implícitamente un entero, es decir, int . Como tal, solo puedes tratarlo como un entero. Si intentas desempaquetarlo por long , fallará.

Opciones:

  • si el valor se ajusta, simplemente trátelo como int en el lado .NET
  • de lo contrario, use un parámetro de out de tipo bigint y trátelo como long en el lado .NET
  • o use select y Query<long>(...).Single()

Respuesta popular

Si mal no recuerdo, SCOPE_IDENTITY () devuelve un decimal ( http://msdn.microsoft.com/en-us/library/ms190315.aspx ), de ahí la excepción de conversión no válida.

Debes convertirlo en bigint (en el SQL) para que funcione como lo desees.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow