【问题标题】:What is the best way of getting value from a DataRow?从 DataRow 中获取价值的最佳方式是什么?
【发布时间】:2013-06-10 07:51:03
【问题描述】:

所有,我正在尝试找到一种优雅的方式来从DataRow 中检索值。以下是我尝试过的方式。请审查它。我认为它还不够好。因为当我要检索的字段数量很大时,它会很冗长。有更好的主意吗?谢谢。

  int result = -1;

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

更新

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

更新

Most efficient way to check for DBNull and then assign to a variable?找到它

干杯。

【问题讨论】:

  • 如果row["intCol"] 总是一个整数,你可以这样做:int result = (int)row["intCol"]。否则,请先检查类型。 int->string->int 转换(我认为你在做什么)似乎是错误的
  • 如果您知道应该存在什么类型 - row.Field<int?>("intCol")(以避免 DBNull 失败)
  • 您好,很抱歉忘记指定intCol 的数据库类型。它是可为空的字符串。谢谢。

标签: c# asp.net datatable


【解决方案1】:

使用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"]) 允许类型转换。
  • ...结合IsNull 事先检查列。
  • 我明白了。那么为什么不使用 tryparse 特别是当原始数据类型是 string 时。谢谢。
  • 如果原始类型是字符串,我肯定会使用TryParseConvert.ToXXX可以为您转换字符串,但它始终使用用户当前的区域设置来确定如何解析数字和日期。
【解决方案2】:

您可以使用内置的Field&lt;int?&gt; 属性来获取结果:

var result = row.Field<int?>("intCol");

【讨论】:

  • 嗨@Cuong Le,如果数据库中的值为空怎么办?我们应该使用 int? 还是 var ?谢谢
【解决方案3】:

您可以使用 Convert(特别是如果类型也可能是 BIGINT、SMALINT 等)。

 var i = Convert.ToInt32(row["intCol"]); // i is a int

注意这会将 NULL 转换为 0。

如果您确定 DB 类型是 INT(而不是 BIGINT、SMALINT 等),请使用“as”(DB NULL 将变为空引用)

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

【讨论】:

  • 嗨@Serge,在最坏的情况下。 DB 类型可以是可为空的字符串。我想。
  • 然后在检查 row["intCol"] == DBNull.Value 后使用“Convert”?
猜你喜欢
  • 2010-11-06
  • 1970-01-01
  • 2022-01-26
  • 2011-10-29
  • 2015-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多