示例代码:
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")
之间有区别吗?当然,第二种方式将价值转化为某种类型,但又有另一种区别吗? 答案 0 :(得分:16)
请参阅Remarks section,其中描述的主要差异:
DataSet 类使用Value实例表示 null 值 DBNull 类。语言集成查询(LINQ)表达式 访问具有 null 值的列将生成一个 运行时 InvalidCastException 。此外, DataSet 不会 支持可以为空的类型。 Field方法提供支持 以可空类型访问列。如果潜在价值在 DataSet为Value,返回的可空类型的值为 的空强>
如果指定的 DataColumn 的值为null且 T 为 引用类型或可空类型,返回类型将为 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中,它“提供对指定行中每个列值的强类型访问.Oield方法还支持可空类型。”< / p>
Afaik,row["name"]
返回object
,row.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")