2014-02-06 2 views
5

Я использую Dapper (спасибо Sam, отличный проект.) Микро ORM с DAL и по какой-то причине я не могу выполнять хранимые процедуры с входными параметрами.Выполнение хранимой процедуры с параметрами в Dapper

В определенной службе у меня есть что-то вроде этого:

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', который не был предоставлен.

Мой DAL похож на этот проект github Pencroff.

Я что-то упустил?

Update: Я на самом деле прохождения CommandType через 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) 
    { 
    } 
} 

ответ

16

Вы должны сказать ему тип команды: убедитесь, что есть в щеголеватый вызову 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)

+0

Привет, Марк, спасибо за ответ. Я фактически передаю commandType на SomethingEnum. Эта проблема как-то связана с моим DAL на DynamicParameters. Если я выполнил его inline, он работает. – antao

+0

@antao well, 'Exec ' не похоже на метод dapper. Можете ли вы показать, где это фактически становится звоном? –

+0

Я действительно использовал эту реализацию для него: https://github.com/Pencroff/Dapper-DAL/blob/master/Dapper-DAL/Infrastructure/Repository.cs – antao

0

Вам необходимо расширить его, чтобы поддерживать исходящие параметры и возвращать результаты, но он содержит часть для создания динамических параметров Dapper.

internal static bool ExecuteProc(string sql, List<SqlParameter> paramList = null) 
{ 
    try 
    { 
     using (SqlConnection conn = new SqlConnection (GetConnectionString())) 
     {      
      DynamicParameters dp = new DynamicParameters(); 
      if(paramList != null) 
       foreach (SqlParameter sp in paramList) 
        dp.Add(sp.ParameterName, sp.SqlValue, sp.DbType); 
      conn.Open(); 
      return conn.Execute(sql, dp, commandType: CommandType.StoredProcedure) > 0; 
     } 
    } 
    catch (Exception e) 
    { 
     //do logging 
     return false; 
    } 

}

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

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

Так как это был главный результат для меня, но не было никаких ответов, которые имеют дело с ExecuteNonQuery со столом оценивается параметрами, вот код, который:

var queryParameters = new DynamicParameters(); 
queryParameters.Add("@Param0", datatable0.AsTableValuedParameter()); 
queryParameters.Add("@Param1", datatable1.AsTableValuedParameter()); 
var result = await ExecuteStoredProc("usp_InsertUpdateTest", queryParameters); 

private async Task<Result<int>> ExecuteStoredProc(string sqlStatement, DynamicParameters parameters) 
    { 
     try 
     { 
      using (SqlConnection conn = new SqlConnection(connectionString)) 
      { 
       await conn.OpenAsync(); 
       var affectedRows = await conn.ExecuteAsync(
        sql: sqlStatement, 
        param: parameters, 
        commandType: CommandType.StoredProcedure); 
       return Result.Ok(affectedRows); 
      } 
     } 
     catch (Exception e) 
     { 
      //do logging 
      return Result.Fail<int>(e.Message); 
     } 
    }