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

Estoy tratando de usar SCOPE_IDENTITY para devolver una clave principal larga a c # usando la opción ReturnValue para DynamicParameter.

Aquí está el código de muestra del sitio 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("@b"); int c = p.Get("@c"); 

En lugar de devolver 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("@b"); int c = p.Get("@c"); 

En mi proceso, estoy usando “RETURN SCOPE_IDENTITY ()”.

Sin embargo, hacer esto parece dar como resultado que “la conversión especificada no es válida”. excepción.

El valor de retorno de un procedimiento almacenado siempre es implícitamente un número 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 bigint estén en el lado .NET
  • o use select y Query(...).Single()

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

Debe convertirlo en bigint (en el SQL) para que funcione como usted lo desea.