私たちが持っているすべての ADO.NET コネクタでAddWithValue
、パラメータを追加するのは簡単でした。IDataParameterCollection
そのオーバーロードが onまたは on でも利用できないことに驚いていますDbParameterCollection
。ベンダーに依存しないレイヤー (インターフェイスに対するコーディング) を作成するときに、(呼び出し側と呼び出し側の両方から) 最小限の手間で同じことを達成するにはどうすればよいですか?
今私は:
public void Execute(string query, Action<IDbCommand> parameterizer)
Execute(query, cmd =>
{
var param = cmd.CreateParameter();
param.ParameterName = "user_id";
param.Value = 1;
cmd.Parameters.Add(param);
param = cmd.CreateParameter();
param.ParameterName = "mf";
param.Value = "6CE71037";
cmd.Parameters.Add(param);
});
それはやりすぎですよね。それ以外の場合は、署名を変更できます:
public void Execute(string query, IEnumerable<KeyValuePair<string, object>> parameters)
var parameters = new Dictionary<string, object>
{ { "user_id", 1 }, { "mf", "6CE71037" } };
Execute(query, parameters);
Execute
このアプローチでは、呼び出し先 (メソッド)内に別のループを記述する必要があります。これはほとんど私が望むものですが、より簡潔なアプローチがあるかどうかを確認するだけです. たとえば、次のようにします。
public void Execute(string query, Action<IDataParameterCollection> parameterizer)
Execute(query, p =>
{
p["user_id"] = 1;
p["mf"] = "6CE71037";
});
これにより、ランタイム例外が発生しますUnable to cast object of type 'System.Int32' to type 'System.Data.Common.DbParameter
。私はエラーを理解しています。もっとエレガントなパターンがあるかどうか疑問に思っています..