C# DataReader有行和数据,试图从中读取时说;“没有数据存在”;

C# DataReader有行和数据,试图从中读取时说;“没有数据存在”;,c#,sqldatareader,C#,Sqldatareader,我已经很久没有使用DataReader了(我更喜欢使用ORM),但我不得不在工作中使用它。我将行向后拉,并检查HasRows是否为真;此时调试并检查读取器表明我的数据在那里 现在问题来了:当我调用reader.Read(),试图扩展结果时,会显示“枚举未产生任何结果”或其他内容,而我得到的是“在不存在数据时读取的尝试无效”错误。如果不调用Read()(这是默认值,因为DataReader在第一条记录之前启动) 我不记得该怎么处理这件事了;当我检查HasRows时,数据就在那里,但是在我尝试在调用

我已经很久没有使用DataReader了(我更喜欢使用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
        };
    }
}

如果要将数据放入文件中,请从加载DataTable开始,而不是使用DataReader。 如注释中所述,使用DataReader,您可能希望使用while循环迭代结果集

while (reader.Read())
{

}
循环一次读取一行,并在读取所有行后退出。 移动到下一行后,上一行将不再可用,除非将它们放入其他结构中,如列表或数据表

但是您可以使用DataAdapater来填充DataTable,因此可能没有理由使用DataReader。然后您可以从DataTable写入文件

无论如何,我看不出这条线是如何工作的。

FileName = Convert.ToString(reader["FileName"])
如果您愿意,我可以为任何一种方法发布附加代码。

HTH Harvey Sather

为了澄清答案,它使用了调试器,因为扩展结果视图调用了
Read()
,因此它移过了行。正如Marc Gravell在评论中所说:调试器被认为是有害的确实
reader.Read()
返回
true
false
?为什么不直接使用
if(reader.Read())
while(reader.Read())
?还有-当你说“通过调试器验证”…准确程度如何?(只是想看看你的测试是否破坏了数据)为了证实@Marc所说的话,我在过去遇到过一个问题,将鼠标悬停在一个可查询的变量上会导致调试器获取结果,这意味着代码无法完成,因为您只能枚举一次记录(调试器已经完成了)。这会是同样的事情吗?(手表也会发生这种情况吗?)@Marc我展开了
ResultsView
属性,它显示了一个“DataRecordInternal”枚举,然后它有一些属性,如果我足够深入,我可以看到返回的数据。但它只工作一次;在我第一次深入到ResultsView之后,所有未来的尝试都会显示“枚举没有结果”(这是有意义的,因为它会移动数据读取器)。此外,yes
reader.Read()
返回true,但在我尝试实际使用值时仍然表示没有数据;顺便说一句,如果在调用Read()后展开,我仍然会得到“枚举未产生结果”,但它在HasRows期间有结果。@Wayne-调用Read()时都有结果钻取改变状态,它将不再工作。不要这样做(在这种情况下)。我认为在这种情况下:调试器被认为是有害的。那么,如果不使用调试器/监视窗口/等等,会发生什么?