【问题标题】:difference between getting value from DataRow从 DataRow 获取价值的区别
【发布时间】:2011-10-29 14:24:10
【问题描述】:

示例代码:

    DataTable table = new DataTable();

    // ...
    // insert column to table

    table.Columns.Add("name");

    // ...
    // insert value to table

    foreach (DataRow row in table.Rows) {
         row["name"];
         row.Field<string>("name");     
    }

我的问题是:

  • 使用row["name"]row.Field&lt;string&gt;("name") 有区别吗?当然,第二种方式将值转换为某种类型,但还有其他区别吗?
  • 哪种方法更好用?

【问题讨论】:

    标签: c# datatable datarow


    【解决方案1】:

    参见Remarks section,其中描述了主要区别:

    DataSet 类用 Value 实例表示 nullDBNull 类。语言集成查询 (LINQ) 表达式 访问具有 null 值的列将生成 InvalidCastException 在运行时。此外,DataSet 不 支持可为空类型。 Field 方法支持 以 可为空 类型访问列。如果标的值在 DataSet 为 Value,返回的可为空类型的值为 null

    如果指定的 DataColumn 的值为 null 并且 T 是 引用类型或可空类型,返回类型将为 null。这 字段方法不会返回值。

    Field 方法不执行类型转换。如果键入 需要转换,您应该首先通过以下方式获取列值 使用字段方法。然后应将列值转换为 另一种类型。

    最后一段说明了一点,因为我经常看到在数据库中存储为字符串的数字,因此在数据检索时需要将varchar 转换为int,因此在这种情况下使用 DataColumn 更好,例如:

    int test = row.Field<int>("Test"); // InvalidCastException
    int test = Convert.ToInt32(row["Test"]); // Works like a charm
    

    DataRowExtensions.Field&lt;T&gt; Method (DataRow, String) 首次出现在 .NET 3.5 中,它“提供对指定行中每个列值的强类型访问。Field 方法还支持 nullable 类型。”

    Afaik,row["name"] 返回 objectrow.Field&lt;string&gt;("name") 返回 String。 我们不应该比较苹果和梨,因此你应该问什么更好:

    row["name"].ToString()row.Field&lt;string&gt;("name") 答案是:它们是一样的。

    【讨论】:

    • 所以,如果没有任何区别,我认为第二种选择更好。当我们希望将值转换为 int 时,int.Parse( row["name"].ToString()) vs row.Field&lt;int&gt;("name")
    • 添加我的 1 美分,如果 row["name"] 为 null,row["name"].ToString() 可能会导致 RuntimeException
    • 我添加了一个示例,您可以使用“旧”方式而不是新方式。
    • 那么要访问可能为空的字段,我们应该使用可空类型吗?例如row.Field&lt;int?&gt;("Text") ?
    【解决方案2】:

    这取决于您的目的,但如果您查看两者的定义可能会告诉您;

    DataRow.Item Property (DataColumn)row["name"]

    DataRowExtensions.Field Method (DataRow, DataColumn)row.Field&lt;string&gt;("name")

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-17
      • 2010-11-21
      • 1970-01-01
      • 2017-08-15
      • 2017-01-08
      相关资源
      最近更新 更多