idbcommandパラメーターを検証する最良の方法
-
15-10-2019 - |
質問
クラスがあるとしましょう
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 :(オブジェクト)dbnull.value; 。私の質問はまさにこの分野にあります。提供されるパラメーターが多すぎる場合。すべてのパラメーターでこのような価値をチェックすると、ちょっと悪いように見えます。ここでの質問は、この種のことをするための最良の方法は何ですか?誰がそのDLまたはBLをすべきですか? BLの場合、そこにdbnull値を割り当てる必要がありますか?これを行う他の標準的な方法はありますか?
解決
一般的な拡張法を試してみませんか?
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);
他のヒント
最も完全な解決策は、これを自分で行わないことです。ここに役立つ多くのフレームワークがあります - たとえば、NhibernateまたはEntity Frameworkをご覧ください。
実際にこれを手動で行う必要がある場合は、再利用可能な方法にチェックをリファクタリングできます。このようなもの:
public void AddIntParameterWithNullForZero(IDataCommand command, string parameterName, int parameterValue)
{
// Add the parameter and perform the checks here.
}
所属していません StackOverflow