从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方法获取列值。 然后应将列值转换为另一种类型。

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

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

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

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

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

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

DataRow.Item属性(DataColumn) row["name"]

DataRowExtensions.Field方法(DataRow,DataColumn) row.Field("name")