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

Ian*_*oyd 11 .net ado.net datareader

dataReader[i]
Run Code Online (Sandbox Code Playgroud)

在逻辑上相当于

dataReader.GetValue(i)
Run Code Online (Sandbox Code Playgroud)

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

不同的记录:

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

但是当我使用它们时,它们都会返回该字段的值."获得专栏"是什么意思?"归还一个领域的价值"是什么意思?


奖金Chatter:

我打电话的时候:

reader[i];
reader.GetValue(i);
reader.GetString(i);
Run Code Online (Sandbox Code Playgroud)

String每次都得到一个

Ada*_*lph 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.如果该列中的值不是a string,InvalidCastException则抛出a.当您确定值是a string并且string是要使用的类型时,请使用此方法.这将使您的代码更简洁,因为您不必执行强制转换.

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

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

  • @ Ian,@ Adam:这简直与(联合国)拳击有关; 与`SqlDataReader`,`IDataReader`等本身没有直接关系.通常,盒装值只能取消装箱到*exact*类型.例如,`object o =(byte)42; int i =(int)o;`将以完全相同的错误失败,即使未装箱的`(byte)42`可以很好地转换为`int`. (3认同)