有没有更好的方法来执行此操作:Convert.IsDBNull(row [somecolumn])检查

时间:2009-08-24 20:36:47

标签: c# ado.net

有没有更好的方法来编写此代码..

MyObject pymt = new MyObject();
pymt.xcol1id= Convert.IsDBNull(row["col1id"]) ? 0 : (int)row["col1id"];
pymt.xcold2id= Convert.IsDBNull(row["col2id"]) ? String.Empty : (string)row["col2id"];
pymt.xcold3id = Convert.IsDBNull(row["CustNum"]) ? 0 : (decimal)row["xcold3id"];

这可以用更干净的方式来完成......就像通用方法一样吗?

7 个答案:

答案 0 :(得分:10)

您可以制作如下通用扩展方法:

public static class DataRowExtensions {

   public static T GetValueOrDefault<T>(this DataRow row, string key) {
      return row.GetValueOrDefault(key, default(T));
   }

   public static T GetValueOrDefault<T>(this DataRow row, string key, T defaultValue) {
      if (row.IsNull(key)) {
         return defaultValue;
      } else {
         return (T)row[key];
      }
   }

}

用法:

MyObject pymt = new MyObject();
pymt.xcol1id = row.GetValueOrDefault<int>("col1id");
pymt.xcold2id = row.GetValueOrDefault<string>("col2id", String.Empty);
pymt.xcold3id = row.GetValueOrDefault<int>("CustNum"]);

答案 1 :(得分:7)

我倾向于在那些情况下使用空合并运算符。此外,DBNull.ToString返回string.Empty,因此您不必在那里做任何事情。

MyObject pymt = new MyObject();
pymt.xcol1id= row["col1id"] as int? ?? 0;
pymt.xcold2id= row["col2id"].ToString();
pymt.xcold3id = row["CustNum"] as decimal? ?? 0;

答案 2 :(得分:7)

如果您使用的是.NET 3.5,并且没有重新发明Microsoft已经为您编写的扩展方法,那么编写该代码绝对是一种更简洁的方法。只需添加对System.Data.DataSetExtensions.dll的引用,您就可以执行此操作:

MyObject pymt = new MyObject
                {
                    xcol1id = row.Field<int?>("col1id") ?? 0,
                    xcol2id = row.Field<string>("col2id") ?? String.Empty,
                    xcol3id = row.Field<decimal?>("col3id") ?? 0M
                };

答案 3 :(得分:3)

更好的是,将其作为扩展方法添加到DataRow

static T GetValueOrDefault<T>(this DataRow row, string columnName)
{
    if (!row.IsNull(columnName))
    {
        // Might want to support type conversion using Convert.ChangeType().
        return (T)row[columnName]
    }

    return default(T);
}

您可以像以下一样使用它:

pymt.xcol1id = row.GetValueOrDefault<int>("col1id");
pymt.xcol2id = row.GetValueOrDefault<string>("col2id");
pymt.xcol3id = row.GetValueOrDefault<decimal>("col3id");

答案 4 :(得分:2)

 static ToType GenericConvert<ToType>(object value)
        {
            ToType convValue = default(ToType);

            if (!Convert.IsDBNull(value))
                convValue = (ToType)value;

            return convValue;
        }


MyObject pymt = new MyObject();
pymt.xcol1id= GenericConvert<int>(row["col1id"]);
pymt.xcold2id= GenericConvert<string>(row["col2id"]) ?? String.Empty;
pymt.xcold3id = GenericConvert<decimal>(row["CustNum"]);

答案 5 :(得分:1)

我其实很喜欢。我们的团队一直在使用if / else语句,我认为这些语句更难阅读。

if (row["col1id"] == dbnull.value)
   pymt.xcol1id = 0;
else
   pymt.xcol1id = (int)row["col1id"];

您的代码更易于阅读,因为它会将每个作业分配到各行。

Stan建议的函数可能会缩短行,但它隐藏了这样一个事实,即除非你给它一个非常详细的名称,否则会替换它。

答案 6 :(得分:1)

我可以很快想到一些替代方案:

  1. 强类型数据集
  2. 使用像ReadSqlInt32这样的SqlTypes读者,因为它们都实现了INullable
  3. 使用XML进行XSLT转换生成代码,因此检查代码易于更改和维护。