DataReader [i] vs DataReader.GetValue(i)vs DataReader.GetString(i)

时间:2011-12-08 20:29:59

标签: .net ado.net datareader

dataReader[i]

在逻辑上等同于

dataReader.GetValue(i)

它们是一样的吗?他们不一样吗?是否存在一种适合另一种情况的情况?

documented differently

  
      
  • 获取位于指定索引
  • 的列   
  • 返回指定字段的值。
  •   

但是当我使用它们时,它们都返回该字段的值。 “获得专栏”是什么意思? “返回一个字段的价值”是什么意思?


Bonus Chatter

我打电话的时候:

reader[i];
reader.GetValue(i);
reader.GetString(i);

我每次都获得String

1 个答案:

答案 0 :(得分:16)

最终取决于您所指的System.Data.IDataReader的具体实现,但我们假设您的意思是System.Data.SqlClient.SqlDataReader

在这种情况下,reader[i]reader.GetValue(i) 完全相同。事实上,reader[i]在内部调用reader.GetValue(i)。 (您可以通过使用ILSpy等工具反汇编代码来查看。这两个成员都返回当前行的第i列中的值,并且无论值的类型如何(返回类型为object)都将成功返回。这两个成员的文档有点误导,可以用更好的方式措辞。您可以随意使用这些成员中的任何一个,只需选择您认为更好的成员。

reader.GetString(i)专门用于将当前行的第i列中包含的值作为string返回。如果该列中的值不是string,则会抛出InvalidCastException。如果您确定值为string并且string是您要使用的类型,请使用此方法。这将使您的代码更简洁,因为您不必执行演员表。

在您的特定情况下,当前行的第i列中的值必须是string类型,这就是所有三个成员的返回值相同的原因。

如果写得正确,System.Data.IDataReader的其他实现应该以相同的方式运行。