IDataReader在第二次查看时清空

时间:2008-11-03 18:36:56

标签: .net mysql-connector

当尝试使用MySql .net连接器读取某些数据时,我发现了一些非常奇怪的事情。这是代码:

IDataReader reader = null;

using (MySqlConnection connection = new MySqlConnection(this.ConnectionString))
{
    String getSearch = "select * from organization";
    MySqlCommand cmd = new MySqlCommand(getSearch, connection);
    cmd.CommandType = CommandType.Text;

    connection.Open();
    reader = cmd.ExecuteReader();

    while (reader.Read())
    {
        // response write some stuff to the screen (snipped for brevity)
    }
}

如果我在ExecuteReader之后放置一个断点并在Visual Studio中展开结果视图(将鼠标悬停在阅读器上并展开),我可以看到查询返回的行。如果我再关闭并再次展开结果视图,我会收到消息“枚举没有结果”。

看起来好像读者的内容一旦被查看就会被重置。

至于我们尝试过的事情:
- SQL直接运行到DB
- 将查询结果直接绑定到数据网格只返回一个空数据网格 - 获得最新版本的.net连接器
- 尝试在两台不同的机器上排除任何本地错误

到目前为止,没有任何工作。

如果有人能提供任何想法或建议,我们将非常感激。

3 个答案:

答案 0 :(得分:2)

据我所知,SqlDataReader旨在用于一次性枚举您返回的数据。一旦你完成了一次循环结果,对象就完成了它的任务。以下是一些解决此问题的想法,其中一个或多个可以根据您的需求为您解决此问题:

  1. 重新执行查询以在需要时生成另一个SqlDataReader

  2. 不使用SqlDataReader,而是将原始查询的结果存储到System.Data.DataTable中,然后您可以根据需要重新读取和操作数据。

  3. 希望这有帮助!

    亚当

答案 1 :(得分:0)

由于datareader读入信息,因此使用块在将其值赋给变量后立即关闭与读取器的连接。 Here is an article向您展示了一些代码示例,可能会将您带到您需要的位置。

关键是当试图从阅读器读取时必须打开连接。

答案 2 :(得分:0)

以下是解释:

这是因为,您已经在调试器中浏览了一次读取器(第一次展开视图时)。这是读者的工作方式,据我所知,除了重新执行选项之外,没有办法重置读者从头开始再读,除了重新执行选项:

  

你只需要再次运行   cmd.ExecuteReader();行(右)   单击源并使用“设置   下一个声明“菜单选项”。

这是数据读者的行为。如果你已经通过它,你就不能回去了。您必须再次执行该命令并检索一个新命令。

如果您在关闭阅读器后需要使用数据,则可以选择使用Typed DataSet或Adam answer中指定的无类型DataSet

顺便说一句,这里有一些optimizations

  • 将阅读器移到内部 Connection使用块来制作它 完成后超出范围 使用它(一旦你不使用它 阻止,连接将被关闭 并且无论如何你都无法使用它,所以把它留在外面就没有意义了。)
  • 运行ExecuteReader 另一个using块(因为它实现了IDisposable)并使用Sql Command(相同的IDisposable接口)执行相同的操作
  • 不要检索 数据库中的所有字段