我正在使用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)
{
}
}
你需要告诉它命令类型:确保在dapper调用中有一个commandType: CommandType.StoredProcedure
。否则,它只是执行文本命令:
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
的可选参数)
var queryParameters = new DynamicParameters();
queryParameters.Add("@parameter1", valueOfparameter1);
queryParameters.Add("@parameter2", valueOfparameter2);
await db.QueryAsync<YourReturnType>(
"{NameOfStoredProcedure}",
queryParameters,
commandType: CommandType.StoredProcedure)