web-dev-qa-db-ja.com

Dapperで/パラメータを使用してストアドプロシージャを実行する

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

    ...

}

ストアドプロシージャの実行がトリガーされると、「somethingId」を提供する必要があることを示すSqlExceptionがスローされます。

プロシージャまたは関数 'spMyStoredProcedure'には、指定されていないパラメーター '@somethingId'が必要です。

私の [〜#〜] dal [〜#〜] は、Pencroffのこのgithubプロジェクトに基づいて似ています。

ここに何かが足りませんか?

更新:実際に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)
    {
    }
}
15
antao

コマンドタイプを伝える必要があります。dapper呼び出しに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に設定されるオプションのパラメーターにすることができます)

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

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

これは私にとって最高の結果でしたが、テーブル値パラメーターを持つ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);
        }
    }
1
ToDevAndBeyond

アウトバウンドパラメータと結果を返すように拡張する必要がありますが、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;
    }

}

0
Lodlaiden

これは私のために働く。これを行うメソッドは非同期であるため、awaitおよびQueryAsyncであることに注意してください。また、送信される「Id」パラメーターを容易にするために匿名タイプが作成されることにも注意してください。

await dbConnection.QueryAsync<Something>("StoredProcedureNameGoesHere @Id", new { Id = id });
0
askepott