0

假设我有一堂课

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 值吗?有没有其他标准方法可以做到这一点?

4

2 回答 2

0

最完整的解决方案是不要自己做。有很多框架可以帮助你——例如看看 NHibernate 或 Entity Framework。

如果您确实需要手动执行此操作,则可以将检查重构为可重用的方法。像这样的东西:

  public void AddIntParameterWithNullForZero(IDataCommand command, string parameterName, int parameterValue) 
  {
    // Add the parameter and perform the checks here.
  } 
于 2011-01-04T08:56:52.027 回答
0

为什么不尝试通用扩展方法?

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);
于 2011-01-04T09:32:39.677 回答