从DataRow获取值的最佳方法是什么?

3

大家好,我正在尝试寻找一种优雅的方式从DataRow中检索值。下面是我尝试过的方法,请审查它。但我认为这还不够好,因为当我想要检索的字段数量很多时,它会变得冗长。有更好的想法吗?谢谢。

  int result = -1;

  if (row["intCol"] != null)
  {
      bool bresult = int.TryParse(row["intCol"].ToString(), out result);
  }

更新

数据库中的intCol数据类型是可空字符串。

更新

最有效的检查DBNull并将其分配给变量的方法?找到它。

干杯。


1
如果 row["intCol"] 总是一个整数,你可以直接这样做:int result = (int)row["intCol"]。否则,请先检查类型。我认为你正在进行的 int->string->int 转换似乎是错误的。 - x4rf41
如果您知道应该有什么类型 - row.Field<int?>("intCol")(以避免与 DBNull 失败) - sq33G
抱歉,我忘记指定 intCol 的数据库类型了。它是可空字符串。谢谢。 - Joe.wang
3个回答

3
使用FieldIsNullSetField方法,避免处理DBNull.Value
在你发布的例子中,你可能只需要使用Field方法。
int? result = row.Field<int?>("intCol");
// if intCol is DBNull.Value, result will now be null.

请注意,Field 方法只会将值强制转换为指定的类型。它不会尝试进行数据类型转换。这意味着,如果值实际上是 decimal 类型,而您指定了 int 类型,那么就会出现 InvalidCastException 异常。如果您在运行时不完全确定数据类型,应该坚持使用 Convert.ToInt32(row["intCol"]) 来允许类型转换。 - bernhof
结合对列进行的 IsNull 检查。 - bernhof
我明白了。所以当原始数据类型是字符串时,为什么不使用tryparse呢?谢谢。 - Joe.wang
使用TryParse的另一个明显好处是,如果字符串无法解析,它不会失败。而Convert.ToXXX会抛出异常。 - bernhof
1
没错。另请参阅:https://dev59.com/x3VC5IYBdhLWcg3wvTxa - bernhof
显示剩余2条评论

1
您可以使用内置的Field<int?>属性来获取结果:
var result = row.Field<int?>("intCol");

嗨@Cuong Le,如果数据库中的值为空怎么办?我们应该使用int?还是var?谢谢。 - Joe.wang

1
你可以使用Convert(特别是如果类型可能也是BIGINT,SMALINT等)。
 var i = Convert.ToInt32(row["intCol"]); // i is a int

请注意,这将把NULL转换为0。

如果您非常确定数据库类型是INT(而不是BIGINT、SMALINT等),请使用"as"(DB NULL将变成null引用)

 var i = row["intCol"] as int?; // i is a nullable int

嗨@Serge,最坏的情况下。DB类型可能是可空字符串。我想。 - Joe.wang
在确认 row["intCol"] == DBNull.Value 后,请使用“Convert”函数。 - Serge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接