Llamar al procedimiento SQL almacenado utilizando Dapper

c# dapper sql

Pregunta

Tengo el siguiente procedimiento almacenado de SQL

GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[GetNextNumberTest]
@NEWNUMBER varchar(100) OUTPUT
AS
BEGIN
    SET NOCOUNT ON;
    SET @NEWNUMBER = 'ABC00001'
    RETURN 1
END   

Estoy tratando de leer el valor NENUMBER usando dapper, aquí está mi código

private string GetNextNumber()
{
    var dynamicParams = new DynamicParameters();
    dynamicParams.Add("rval", DbType.Int32, direction: ParameterDirection.ReturnValue);
    dynamicParams.Add("NEWNUMBER", DbType.String, direction: ParameterDirection.Output);
    var data = db.QueryMultiple("GetNextNumberTest", dynamicParams, commandType:    CommandType.StoredProcedure);
    var result = dynamicParams.Get<string>("NEWNUMBER");
    return result;
}

Pero siempre obtengo el siguiente error

An exception of type 'System.Data.SqlClient.SqlException' occurred in Dapper.dll but was    not handled in user code

Additional information: Error converting data type varchar to int.

Cualquier ayuda es muy apreciada.

Respuesta aceptada

múltiples errores de uso:

  1. pasando DbType.Int32 / DbType.String como el valor en lugar del tipo de datos
  2. si no está pasando un valor de cadena, necesita una pista para la longitud
  3. deberías usar Execute , no QueryMultiple aquí
  4. utilizando el retorno de Execute para indicar el valor de retorno del procedimiento almacenado (simplemente no es así como funciona ADO.NET, el valor de retorno es teóricamente las filas afectadas, pero por lo general es un número sin sentido)

Asi que:

dynamicParams.Add("rval", dbType: DbType.Int32,
    direction: ParameterDirection.ReturnValue);
dynamicParams.Add("NEWNUMBER", dbType: DbType.String,
    direction: ParameterDirection.Output, size: 100);
db.Execute("GetNextNumberTest", dynamicParams,
    commandType: CommandType.StoredProcedure);
var rval = dynamicParams.Get<int>("rval");
var result = dynamicParams.Get<string>("NEWNUMBER");


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué