0

私がクラスを持っているとしましょう

public class foo { public string FooId { get; set; } }

現在、データレイヤーで、IDataCommandのインスタンスを1つ作成し、FooIdをコマンドパラメーターの次のように設定するコードを記述しようとしています。

public void save(foo f, IDbConnection conn)
{ 
    IDataCommand cmd = conn.CreateCommand(); 
    cmd.CommandName = "SP_SAVE_INFO" ; 
    IDataDbParameter param = cmd.CreateParameter(); 
    param.name = "@fooId"; 
    param.value=(f.id>0)?f.id:(object)DbNull.Value;
    cmd.parameters.add(param);
    cmd.ExecuteNonQuery();
}

コード行に気付いた場合--param.value=(f.FooId> 0)?f.id:(object)DbNull.Value; 。私の質問はまさにこの分野にあります。パラメータが多すぎて提供できない場合。すべてのパラメータでこのような値をチェックすると、ちょっと悪いように見えます。ここでの質問は、この種のことを行うための最良の方法は何ですか?誰がそのDLまたはBLを行う必要がありますか?BLの場合、そこにDBNull値を割り当てる必要がありますか?これを行う他の標準的な方法はありますか?

4

2 に答える 2

0

最も完全な解決策は、これを自分で行わないことです。ここで役立つフレームワークはたくさんあります。たとえば、NHibernateまたはEntityFrameworkを見てください。

これを本当に手動で行う必要がある場合は、チェックを再利用可能なメソッドにリファクタリングできます。このようなもの:

  public void AddIntParameterWithNullForZero(IDataCommand command, string parameterName, int parameterValue) 
  {
    // Add the parameter and perform the checks here.
  } 
于 2011-01-04T08:56:52.027 に答える
0

一般的な拡張メソッドを試してみませんか?

public static class IDataDbParameterExtensions
{
    public static void SetValue<T>(this IDataDbParameter parameter, T value)
    {
        if(value == default(T)) // for structs (ValueTypes) like Int, default(T) will be 0 and for classes (RefTypes), it will be null.
        {
            parameter.Value = DBNull.Value;
        }
        else
        {
            parameter.Value = value;
        }
    }
}

次のように使用します。

param.SetValue(f.id);
于 2011-01-04T09:32:39.677 に答える