从DataRow获取值的差异

22

示例代码:

    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个回答

20

请参见备注部分,主要区别在那里描述:

DataSet类使用DBNull类的Value实例表示null值。访问具有null值的列的语言集成查询(LINQ)表达式将在运行时生成InvalidCastException。此外,DataSet不支持nullable类型。Field方法提供了对访问列作为nullable类型的支持。如果数据集中的基础值是Value,则返回的nullable类型将具有null值。

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

Field方法不执行类型转换。如果需要类型转换,则应首先使用Field方法获取列值。然后应将列值转换为另一种类型。

最后一段话指出,我经常看到数字存储为数据库中的字符串,因此在检索数据时需要进行varchar到int的转换,因此在这种情况下使用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中,它“为指定行中的每个列值提供强类型访问。Field方法还支持可空类型。”

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

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


所以,如果没有任何区别,我认为第二个选项更好。当我们想要将值转换为int时,有一个简短的方法 int.Parse(row["name"].ToString())row.Field<int>("name") - nirmus
加上我的一分钱,如果row["Name"]为空,则row["name"].ToString()可能会导致RuntimeException。 - jerjer
我已经添加了一个示例,其中您将使用“旧”方法而不是新方法。 - Ruslan
那么,如果要访问可能为空的字段,我们应该使用可空类型吗?例如 row.Field<int?>("Text") - kristianp

0

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