【发布时间】:2011-06-27 13:54:24
【问题描述】:
我已经很久没有使用过 DataReaders(我更喜欢使用 ORM),但我不得不在工作中使用。我拉回行,并检查HasRows 是否为真;此时调试并检查阅读器表明我的数据在那里。
现在问题来了:当我打电话给reader.Read() 时,试图扩展结果显示“枚举没有产生任何结果”或其他什么,我得到“没有数据时读取的尝试无效”。错误。如果我不调用 Read()(这是默认设置,因为 DataReader 在第一条记录之前启动),我会得到同样的结果。
我不记得处理这个问题的正确方法了;当我检查HasRows 时,数据在那里,但是在我尝试在调用Read 之后或之后立即读取它的那一刻就消失了,好像我没有调用Read,读者应该仍然在第一条记录之前,并且如果设置了从第一条记录开始的属性(SingleRow?我忘记了它的名称),那么我应该能够读取行而不调用 Read,但两种方式似乎都经过包含数据的行。
我忘记了什么?代码相当简单:
TemplateFile file = null;
using (DbDataReader reader = ExecuteDataReaderProc("GetTemplateByID", idParam))
{
if (reader.HasRows) // reader has data at this point - verified with debugger
{
reader.Read(); // loses data at this point if I call Read()
template = new TemplateFile
{
FileName = Convert.ToString(reader["FileName"]) // whether or not I call
// Read, says no data here
};
}
}
【问题讨论】:
-
reader.Read()是否返回true或false?为什么不直接使用if(reader.Read())或while(reader.Read())? -
还有——当你说“用调试器验证”时......如何确切地? (只是想看看你的测试是否破坏了数据)
-
为了确认@Marc 所说的,我过去遇到过一个问题,将鼠标悬停在可查询变量上会导致调试器获取结果,这意味着代码无法完成,因为你只能枚举一次记录(调试器已完成)。这可能是同一件事吗? (手表也会发生这种情况吗?)
-
@Marc 我展开
ResultsView属性,它显示了一个“DataRecordInternal”可枚举,然后它具有属性,如果我深入研究,我可以看到返回的数据。它只工作一次;在我第一次深入到 ResultsView 之后,所有未来的尝试都说“枚举没有产生任何结果”(这是有道理的,因为它会移动数据读取器)。另外,是的reader.Read()返回true,但仍然说当我尝试实际使用一个值时没有数据;顺便说一句,如果我在调用 Read() 后展开,我仍然会得到“枚举没有产生结果”,但它在 HasRows 期间有结果。 -
@Wayne - 调用 Read() 并深入了解 更改状态,它将不再起作用。不要那样做(在这种情况下)。我认为在这种情况下:调试器被认为是有害的。所以;当您不使用调试器/监视窗口/等时会发生什么?
标签: c# sqldatareader