从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("name"); }
我的问题是:
- 使用
row["name"]
和row.Field("name")
之间有区别吗? 当然,第二种方式将价值转化为某种类型,但还有另一种区别吗? - 哪种方法更好用?
请参阅备注部分 ,其中描述的主要差异:
DataSet类使用DBNull类的Value实例表示空值。 访问具有空值的列的语言集成查询(LINQ)表达式将在运行时生成InvalidCastException 。 此外, DataSet不支持可空类型。 Field方法支持将列作为可空类型进行访问。 如果DataSet中的基础值为Value,则返回的可空类型的值为null 。
如果指定的DataColumn的值为null并且T是引用类型或可空类型,则返回类型将为null 。 Field方法不会返回Value。
Field方法不执行类型转换。 如果需要类型转换,则应首先使用Field方法获取列值。 然后应将列值转换为另一种类型。
最后一段提到了一点,因为我经常看到数字存储为数据库中的字符串,因此在数据检索时需要varchar
到int
转换,因此在这种情况下使用DataColumn更好,例如:
int test = row.Field("Test"); // InvalidCastException int test = Convert.ToInt32(row["Test"]); // Works like a charm
DataRowExtensions.Field
首次出现在.NET 3.5中,它“提供对指定行中每个列值的强类型访问DataRowExtensions.Field
方法还支持可空类型。”
Afaik, row["name"]
返回object
, row.Field
返回一个String
。 我们不应该比较苹果和梨,因此你应该问什么更好:
row["name"].ToString()
vs row.Field
,答案是:它们是相同的。
这取决于你的目的,但如果你看一下可能告诉你的两者的定义;
DataRow.Item属性(DataColumn) row["name"]
DataRowExtensions.Field方法(DataRow,DataColumn) row.Field