验证 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 参数

将参数传递给 mySQL 数据库的 IdbCommand

为IDBCommand和SqlCommand.ExecuteNonQueryAsync实现异步ExecuteNonQuery()

2017.11.01 ExecuteNonQueryExecuteScalarExecuteDataSetFillDataSet 流程

在 grails 中验证后处理所有控制器方法中的错误的最佳方法

使用 sklearn 嵌套交叉验证获得最佳参数