验证IDBCommand参数的最佳方法
-
15-10-2019 - |
题
假设我有课
public class foo { public string FooId { get; set; } }
现在,在我的数据层中,我正在尝试编写代码,该代码将创建一个IDATACOMMAND的实例,并将FOOIT设置为命令参数的内容。
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值吗?还有其他标准方法吗?
解决方案
为什么不尝试使用通用扩展方法?
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或实体框架。
如果您真的需要手动执行此操作,则可以将检查重新分配为可重复使用的方法。这样的事情:
public void AddIntParameterWithNullForZero(IDataCommand command, string parameterName, int parameterValue)
{
// Add the parameter and perform the checks here.
}
不隶属于 StackOverflow