验证 IDbcommand 参数的最佳方法
Posted
技术标签:
【中文标题】验证 IDbcommand 参数的最佳方法【英文标题】:Best way to validate IDbcommand parameter 【发布时间】:2011-06-03 06:32:21 【问题描述】:假设我有一堂课
public class foo public string FooId get; set;
现在在我的数据层中,我正在尝试编写代码来创建 IDataCommand 的一个实例并将 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 值吗?还有其他标准方法吗?
【问题讨论】:
有谁知道,我怎样才能让我的代码以完整格式显示而不是上面帖子中的一行? 为您格式化了代码块。您需要为每个代码行添加带有缩进的新行。 【参考方案1】:为什么不尝试通用扩展方法?
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);
【讨论】:
这是一个很好的解决方案,干净且最适合。非常感谢。【参考方案2】:最完整的解决方案是不要自己做。有许多框架可以帮助您 - 例如,看看 NHibernate 或 Entity Framework。
如果您确实需要手动执行此操作,则可以将检查重构为可重用的方法。像这样的:
public void AddIntParameterWithNullForZero(IDataCommand command, string parameterName, int parameterValue)
// Add the parameter and perform the checks here.
【讨论】:
以上是关于验证 IDbcommand 参数的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章
为IDBCommand和SqlCommand.ExecuteNonQueryAsync实现异步ExecuteNonQuery()
2017.11.01 ExecuteNonQueryExecuteScalarExecuteDataSetFillDataSet 流程