【问题标题】:DataReader has rows and data, trying to read from it says "no data is present"DataReader 有行和数据,试图从中读取说“不存在数据”
【发布时间】: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() 是否返回 truefalse ?为什么不直接使用if(reader.Read())while(reader.Read())
  • 还有——当你说“用调试器验证”时......如何确切地? (只是想看看你的测试是否破坏了数据)
  • 为了确认@Marc 所说的,我过去遇到过一个问题,将鼠标悬停在可查询变量上会导致调试器获取结果,这意味着代码无法完成,因为你只能枚举一次记录(调试器已完成)。这可能是同一件事吗? (手表也会发生这种情况吗?)
  • @Marc 我展开ResultsView 属性,它显示了一个“DataRecordInternal”可枚举,然后它具有属性,如果我深入研究,我可以看到返回的数据。它只工作一次;在我第一次深入到 ResultsView 之后,所有未来的尝试都说“枚举没有产生任何结果”(这是有道理的,因为它会移动数据读取器)。另外,是的reader.Read() 返回true,但仍然说当我尝试实际使用一个值时没有数据;顺便说一句,如果我在调用 Read() 后展开,我仍然会得到“枚举没有产生结果”,但它在 HasRows 期间有结果。
  • @Wayne - 调用 Read() 并深入了解 更改状态,它将不再起作用。不要那样做(在这种情况下)。我认为在这种情况下:调试器被认为是有害的。所以;当您不使用调试器/监视窗口/等时会发生什么?

标签: c# sqldatareader


【解决方案1】:

只是为了澄清答案,它正在使用调试器,因为扩展结果视图调用Read(),因此它移过了该行。正如 Marc Gravell 在评论中所说:调试器被认为是有害的

【讨论】:

    【解决方案2】:

    如果要将数据放入文件中,请先加载 DataTable 而不是使用 DataReader。 使用 DataReader,如 cmets 中所述,您可能希望使用 while 循环遍历结果集

    while (reader.Read())
    {
    
    }
    

    循环一次读取一行,并在读取完所有行后退出。 移至下一行后,除非您将它们放入其他结构(如列表或 DataTable)中,否则之前的行将不再可用。

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

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

    FileName = Convert.ToString(reader["FileName"])
    

    如果您愿意,我可以发布任何一种方法的附加代码。
    HTH 哈维萨瑟

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2011-07-24
      • 1970-01-01
      相关资源
      最近更新 更多