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

.net DataReader[i]vs DataReader.GetValue(i)vs DataReader.GetString(i),.net,ado.net,datareader,.net,Ado.net,Datareader,是 逻辑上等同于 dataReader[i] 它们是一样的吗?它们不同吗?是否存在一种情况,其中一种情况比另一种情况更合适 有: 获取位于指定索引处的列 返回指定字段的值 但是当我使用它们时,它们都返回字段的值。“获得专栏”是什么意思?“返回字段的值”是什么意思 奖金聊天: 当我打电话时: dataReader.GetValue(i) 每次我都会得到一个字符串最终它取决于您所指的System.Data.IDataReader的具体实现,但假设您指的是System.Data.SqlCli

逻辑上等同于

dataReader[i]
它们是一样的吗?它们不同吗?是否存在一种情况,其中一种情况比另一种情况更合适

有:

  • 获取位于指定索引处的列
  • 返回指定字段的值
但是当我使用它们时,它们都返回字段的值。“获得专栏”是什么意思?“返回字段的值”是什么意思


奖金聊天

当我打电话时:

dataReader.GetValue(i)

每次我都会得到一个
字符串

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

在这种情况下,
reader[i]
reader.GetValue(i)
做完全相同的事情。实际上,
reader[i]
在内部调用
reader.GetValue(i)
。(您可以通过使用类似的工具分解代码来看到这一点。)。这两个成员都返回当前行第i列中的值,并且无论值的类型如何,都将成功返回(返回类型为
object
)。这两位成员的文件都有点误导性,可以用更好的措辞。你可以在任何你喜欢的地方使用这些成员中的任何一个,只要选择一个你觉得读起来更好的

reader.GetString(i)
是专门设计用来返回当前行的第i列中包含的值作为
string
。如果该列中的值不是
字符串
,将抛出
InvalidCastException
。如果确定值是
字符串
,并且
字符串
是要使用的类型,请使用此方法。这将使您的代码更加简洁,因为您不必执行强制转换

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


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

有一些可怕的边缘情况,其中
GetValue
返回一个
字节,但
GetInt32
无法将一个字节转换为一个Int32。很难判断(特别是因为反汇编代码很难理解)但列中的值必须已经是所需的类型,否则将抛出InvalidCastException(这本身有点误导)。我将编辑答案。事实上,GetInt32()的文档说明“不执行任何转换;因此,检索到的数据必须已经是32位有符号整数。”其他GetXXX方法也有类似的文档记录。@Ian,@Adam:这只是与(un)相关而已装箱;与
SqlDataReader
IDataReader
等本身没有直接关系。通常,装箱的值只能按其确切类型解除装箱。例如,
object o=(byte)42;int i=(int)o;
将以完全相同的错误失败,即使解除装箱的
(byte)42
可以愉快地转换为
int
reader[i];
reader.GetValue(i);
reader.GetString(i);