我在Visual Studio中遇到了一个古怪的“功能”,我有兴趣看看是否有其他人注意过这一点。或者如果它特定于我自己。
我有一些方法可以对数据库执行SQL查询,然后返回OracleDataReader
method()
{
OracleCommand cmd = new command(query, connection);
OracleDataReader r = cmd.ExecuteReader();
return r;
}
当我调试使用此方法的代码时。 我可以单击非公共成员来查看结果中的行。 但是,一旦我查看了这些结果,试图执行一个读取器。在OracleDataReader上的.adad()不包含任何结果。在调试器视图中检查结果会将阅读器显示为空。
任何时候我都不检查结果,执行Read的代码没有任何问题。
我没有通过谷歌找到这方面的证据,但我的搜索技能往往有很多不足之处。如果有人能够在他们自己的系统上证实这一点,或者对原因有所了解,我会非常感激。
非常感谢。
答案 0 :(得分:1)
从IDataReader派生的ADO.NET对象(如OracleDataReader)提供对查询返回的数据的连接,仅向前访问,因此当您在调试可视化工具中查看结果时,实际上是在逐步查看实际数据。程序运行时,DataReader已遍历数据并报告(正确)它现在为空。
如果您希望灵活地在调试器中查看数据,可以考虑使用断开的随机访问数据访问类,如DataSet或DataTable。
答案 1 :(得分:1)
我看到了相反的情况。我做了
OracleDataReader reader = cmd.ExecuteReader();
return reader;
.... return it up the stack a couple more levels;
除非我在堆栈的每个级别调用reader.hasRows
,否则我的结果似乎会消失,当我尝试访问它时我会得到空指针。