从DataRow获取价值之间的差异

时间:2011-08-18 08:45:41

标签: c# datatable datarow

示例代码:

    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<string>("name")之间有区别吗?当然,第二种方式将价值转化为某种类型,但又有另一种区别吗?
  • 哪种方法更好用?

2 个答案:

答案 0 :(得分:16)

请参阅Remarks section,其中描述的主要差异:

  

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

     

如果指定的 DataColumn 的值为null且 T 为   引用类型或可空类型,返回类型将为 null 。该   Field方法不会返回Value。

     

Field方法不执行类型转换。如果输入   转换是必需的,您应该首先获取列值   使用Field方法。然后应将列值转换为   另一种类型。

最后一段提到了一点,因为我经常看到数字存储为数据库中的字符串,因此在数据检索时需要进行varcharint转换,所以在这种情况下使用DataColumn会更好,例如:

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

DataRowExtensions.Field<T> Method (DataRow, String)首次出现在.NET 3.5中,它“提供对指定行中每个列值的强类型访问.Oield方法还支持可空类型。”< / p>

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

row["name"].ToString() vs row.Field<string>("name") 答案是:它们是一样的。

答案 1 :(得分:0)

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

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

DataRowExtensions.Field Method (DataRow, DataColumn) row.Field<string>("name")