私は 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)
{
}
}
コマンドタイプを伝える必要があります。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
に設定されるオプションのパラメーターにすることができます)
var queryParameters = new DynamicParameters();
queryParameters.Add("@parameter1", valueOfparameter1);
queryParameters.Add("@parameter2", valueOfparameter2);
await db.QueryAsync<YourReturnType>(
"{NameOfStoredProcedure}",
queryParameters,
commandType: CommandType.StoredProcedure)
これは私にとって最高の結果でしたが、テーブル値パラメーターを持つ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);
}
}
アウトバウンドパラメータと結果を返すように拡張する必要がありますが、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;
}
}
これは私のために働く。これを行うメソッドは非同期であるため、awaitおよびQueryAsyncであることに注意してください。また、送信される「Id」パラメーターを容易にするために匿名タイプが作成されることにも注意してください。
await dbConnection.QueryAsync<Something>("StoredProcedureNameGoesHere @Id", new { Id = id });