我正在使用Dapper(感谢Sam,很棒的项目.)带有DAL的微型ORM,由于某种原因,我无法使用输入参数执行存储过程.
在示例服务中,我有以下代码:
public void GetSomething(int somethingId) { IRepositoryrepository = UnitOfWork.GetRepository (); var param = new DynamicParameters(); param.Add("@somethingId", dbType: DbType.Int32, value:somethingId, direction: ParameterDirection.Input); var result = repository.Exec (SomethingEnum.spMyStoredProcedure, param); ... }
当触发执行存储过程时,抛出SqlException声明我需要提供'somethingId'
过程或函数'spMyStoredProcedure'需要参数'@somethingId',这是未提供的.
我的DAL类似于Pencroff的这个github项目.
我在这里错过了什么吗?
更新:我实际上是通过SomethingEnum传递commandType:
public class SomethingEnum : EnumBase{ public static readonly SomethingEnum spMyStoredProcedure = new SomethingEnum("spMyStoredProcedure", "[dbo].[spMyStoredProcedure]", CommandType.StoredProcedure); public SomethingEnum(string Name, string EnumValue, CommandType? cmdType): base(Name, EnumValue, cmdType) { } }
Marc Gravell.. 31
你需要告诉它命令类型:确保commandType: CommandType.StoredProcedure
在短小精悍的调用中有一个.否则,它只是执行text命令:
spMyStoredProcedure
(在环境上下文中有一些未使用的参数).这是合法的TSQL,并尝试在spMyStoredProcedure
不传递参数的情况下调用- 就像spMyStoredProcedure
放入SSMS并按下一样f5.
此外,如果您的参数是固定的,我实际上建议只使用:
var param = new { somethingId };
甚至只是完全内联它:
var result = repository.Exec(SomethingEnum.spMyStoredProcedure, new { somethingId }, commandType: CommandType.StoredProcedure);
(注意:如果您的Exec
方法只处理存储过程,您可以将commandType
内部移动到方法 - 或者您可以将其设置为默认的可选参数CommandType.StoredProcedure
)
你需要告诉它命令类型:确保commandType: CommandType.StoredProcedure
在短小精悍的调用中有一个.否则,它只是执行text命令:
spMyStoredProcedure
(在环境上下文中有一些未使用的参数).这是合法的TSQL,并尝试在spMyStoredProcedure
不传递参数的情况下调用- 就像spMyStoredProcedure
放入SSMS并按下一样f5.
此外,如果您的参数是固定的,我实际上建议只使用:
var param = new { somethingId };
甚至只是完全内联它:
var result = repository.Exec<Something>(SomethingEnum.spMyStoredProcedure, new { somethingId }, commandType: CommandType.StoredProcedure);
(注意:如果您的Exec<T>
方法只处理存储过程,您可以将commandType
内部移动到方法 - 或者您可以将其设置为默认的可选参数CommandType.StoredProcedure
)