所以我在 ADO.NET 中运行一个我知道返回单行的查询。我的代码的相关部分如下所示:
SqlCommand sqc = new SqlCommand();
sqc.Connection = new SqlConnection("connection string");
sqc.CommandText = "SELECT A, B FROM C WHERE D=@d";
sqc.Parameters.AddWithValue("@d", "d");
sqc.Connection.Open();
SqlDataReader rdr = sqc.ExecuteReader();
bool boolio = rdr.Read();
String a = (String)rdr["A"];
当我运行它时,我在最后一行出现异常,抱怨我正在尝试读取没有数据的地方。
当我在 VS 中逐步执行此操作时,我会在 rdr.Read() 行执行之前检查 rdr,我可以看到我想要的数据位于阅读器中。然后我调用 rdr.Read() 结果为 FALSE,表示没有更多数据可供我读取。当我再次检查 rdr 时,内部 ResultsView 是空的。
我意识到我可以简单地通过放弃对 Read() 的调用来获取我的数据,但是:这种行为与MSDN 文档相反,该文档明确指出“SqlDataReader 的默认位置在第一条记录之前。因此,您必须调用 Read 开始访问任何数据。”。这也与我在网上找到的每个 SqlDataReader 用法示例相反,例如这个 SO question,它的存在似乎只是为了嘲讽我。
请注意,我已经针对 .NET 3.5 和 .NET 4.5 测试了我的代码,结果相同。
我错过了什么吗?ADO.NET 中是否存在错误?任何输入表示赞赏!
更新1:我在最后一行得到的实际异常是:
System.Data.dll 中出现“System.InvalidOperationException”类型的未处理异常
附加信息:不存在数据时尝试读取无效。
更新 2:
由于 Nathan Skerl 无法重现此行为,并且发布了经过验证的工作代码,但后来对我来说失败了,我怀疑我们运行的平台可能存在问题。作为记录,我使用的是 Windows 7 Professional(64 位)Service Pack 1,并针对 .NET Framework 3.5 和 4.5 编译了我的项目,结果相同。如果有任何我没有包含的相关信息,请告诉我,我会添加它。