3

私たちが持っているすべての 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。私はエラーを理解しています。もっとエレガントなパターンがあるかどうか疑問に思っています..

4

1 に答える 1

7

最後の署名に辞書を使用してみませんか。

public void Execute(string query, Action<Dictionary<string, object>> parameterizer)

Execute(query, p =>
    {
        p["user_id"] = 1;
        p["mf"] = "6CE71037";
    });

次に、Executeメソッドはを使用してActionにデータを入力し、Dictionaryそれに基づいてパラメータを作成できます。

var parameters = new Dictionary<string, object>();
parametrizer(parameters);
foreach (var pair in parameters)
{
    var parameter = f.CreateParameter();
    parameter.ParameterName = pair.Key;
    parameter.Value = pair.Value;
    cmd.Parameters.Add(parameter);
}

実際を渡したい場合の別の解決策は、拡張メソッドIDbCommandを使用することです。

public static void AddWithValue<T>(this IDbCommand command, string name, T value)
{
    var parameter = command.CreateParameter();
    parameter.ParameterName = name;
    parameter.Value = value;
    command.Parameters.Add(parameter);
}

これを呼び出すと、次のようになります。

Execute(query, cmd =>
    {
        cmd.AddWithValue("user_id", 1);
        cmd.AddWithValue("mf", "6CE71037");
    });
于 2013-02-13T13:19:40.263 に答える