当尝试使用 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直接在数据库上运行良好
- 将查询结果直接绑定到数据网格只会返回一个空数据网格
- 获取最新版本的.net 连接器
- 在两台不同的机器上尝试以排除任何本地错误

到目前为止没有任何效果。

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

有帮助吗?

解决方案

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

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

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

  3. 希望这有帮助!

    亚当

其他提示

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

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

解释如下:

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

你只需要再次运行 cmd.ExecuteReader(); 行(右键单击源,并使用“ SET NEXT语句”菜单选项)。

这是数据读取器的行为。如果你已经循环过了,就无法返回。您必须再次执行该命令并检索新的命令。

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

顺便说一句,这里有一些 optimizations 你可以做:

  • 将阅读器移至Connection 使用块在使用后将其脱离范围(一旦您出现了使用块,连接将关闭,并且您将无法使用它,因此将其留在外面是没有意义的)
  • 跑步 ExecuteReader 在另一个 using 块(因为它实现了 IDisposable)并对 Sql 执行相同的操作 Command (相同 IDisposable 界面)
  • 不要从数据库中检索所有字段
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top