Ejecutar el procedimiento almacenado con los parámetros en Dapper.

c# dapper data-access-layer sql stored-procedures

Pregunta

Estoy usando Dapper (gracias Sam , gran proyecto) un micro ORM con un DAL y por alguna razón no puedo ejecutar procedimientos almacenados con parámetros de entrada.

En un servicio de ejemplo tengo el siguiente código:

public void GetSomething(int somethingId)
{
    IRepository<Something, SomethingEnum> repository = UnitOfWork.GetRepository<Something, SomethingEnum>();

    var param = new DynamicParameters();
    param.Add("@somethingId", dbType: DbType.Int32, value:somethingId, direction: ParameterDirection.Input);

    var result = repository.Exec<Something>(SomethingEnum.spMyStoredProcedure, param);

    ...

}

Cuando se desencadena la ejecución del procedimiento almacenado, se lanza una excepción SqlException que indica que necesito proporcionar el 'somethingId'

El procedimiento o la función 'spMyStoredProcedure' esperan el parámetro '@somethingId', que no se suministró.

Mi DAL es similar basado en este proyecto github de Pencroff.

¿Me estoy perdiendo de algo?

Actualización: en realidad estoy pasando el commandType a través del SomethingEnum:

 public class SomethingEnum : EnumBase<SomethingEnum, string>
 {
    public static readonly SomethingEnum spMyStoredProcedure = new SomethingEnum("spMyStoredProcedure", "[dbo].[spMyStoredProcedure]", CommandType.StoredProcedure);

    public SomethingEnum(string Name, string EnumValue, CommandType? cmdType): base(Name, EnumValue, cmdType)
    {
    }
}

Respuesta aceptada

commandType: CommandType.StoredProcedure indicarle el tipo de comando: asegúrese de que haya un commandType: CommandType.StoredProcedure en la llamada de commandType: CommandType.StoredProcedure . De lo contrario, simplemente está ejecutando el comando de texto :

spMyStoredProcedure

(con algunos parámetros no utilizados en el contexto ambiental). Esto es TSQL legal, e intenta llamar a spMyStoredProcedure sin pasar parámetros , lo mismo que si pusiera spMyStoredProcedure en SSMS y presione f5 .

Además, si sus parámetros son correctos, sugeriría simplemente usar:

var param = new { somethingId };

o incluso solo en línea por completo:

var result = repository.Exec<Something>(SomethingEnum.spMyStoredProcedure,
    new { somethingId }, commandType: CommandType.StoredProcedure);

(Nota: si su método Exec<T> solo maneja los procedimientos almacenados, podría mover el tipo interno commandType al método, o podría convertirlo en un parámetro opcional que por defecto es CommandType.StoredProcedure )


Respuesta popular

var queryParameters = new DynamicParameters();
queryParameters.Add("@parameter1", valueOfparameter1);
queryParameters.Add("@parameter2", valueOfparameter2);

await db.QueryAsync<YourReturnType>(
    "{NameOfStoredProcedure}",
    queryParameters,
    commandType: CommandType.StoredProcedure)


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é