一尘不染

在Dapper中执行带有参数的存储过程

sql

我正在使用Dapper(感谢Sam,伟大的项目。)一个带有DAL的微型ORM,由于某种原因,我无法使用输入参数执行存储过程。

在一个示例服务中,我具有以下代码:

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);

    ...

}

触发存储过程的执行时,将引发SqlException,表明我需要提供“ somethingId”

过程或函数’spMyStoredProcedure’需要未提供的参数’@somethingId’。

基于Pencroff的github项目,我的DAL很类似。

我在这里想念什么吗?

更新: 我实际上是通过SomethingEnum传递commandType的:

 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)
    {
    }
}

阅读 267

收藏
2021-03-17

共1个答案

一尘不染

您需要告诉它命令类型:确保commandType: CommandType.StoredProceduredapper调用中有一个。否则,它只是执行
文本 命令:

spMyStoredProcedure

(在环境上下文中带有一些未使用的参数)。这是合法的TSQL,并且尝试在spMyStoredProcedure 不传递参数的情况下 进行调用-
就像您放入spMyStoredProcedureSSMS并按一样f5

另外,如果您的参数是固定的,我实际上建议仅使用:

var param = new { somethingId };

甚至只是完全内联:

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

(请注意:如果您的Exec<T>方法仅处理存储过程,则可以将commandType内部方法移至该方法-
或者可以将其设为默认的可选参数CommandType.StoredProcedure

2021-03-17