【问题标题】:Best way to validate IDbcommand parameter验证 IDbcommand 参数的最佳方法
【发布时间】: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 值吗?还有其他标准方法吗?

【问题讨论】:

  • 有谁知道,我怎样才能让我的代码以完整格式显示而不是上面帖子中的一行?
  • 为您格式化了代码块。您需要为每个代码行添加带有缩进的新行。

标签: .net data-access-layer business-logic-layer


【解决方案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.
  } 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 2011-09-24
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多