2

尝试使用 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 连接器
- 在两台不同的机器上尝试排除任何本地错误

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

如果有人能提供任何想法或建议,他们将不胜感激。

4

3 回答 3

2

据我了解,SqlDataReader 旨在用于一次性枚举您返回的数据。一旦您对结果进行了一次循环,该对象就完成了它的职责。以下是解决此问题的一些想法,其中一个或另一个可以根据您的需要为您解决这个问题:

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

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

希望这可以帮助!

亚当

于 2008-11-03T18:45:46.440 回答
0

由于数据读取器读取信息,因此您的 using 块在将其值分配给变量后立即关闭与读取器的连接。 这是一篇文章,向您展示了一些代码示例,这些示例可能会让您到达您需要的地方。

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

于 2008-11-03T18:43:07.897 回答
0

这是解释:

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

您只需再次运行该 cmd.ExecuteReader();行(通过右键单击源并使用“设置下一条语句”菜单选项)。

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

如果您需要在关闭阅读器后使用您的数据,您可以选择使用 aTyped DataSet或Adam's answerDataSet中指定的 untyped 。

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

  • 将阅读器移动到 Connectionusing 块内,使其在完成使用后超出范围(一旦您离开 using 块,连接将被关闭,您将无法使用它,所以它不会感觉把它放在外面)
  • ExecuteReader在另一个using块中运行(因为它实现IDisposable)并使用 Sql 做同样的事情Command(相同的IDisposable接口)
  • 不要从数据库中检索所有字段
于 2008-11-03T19:06:28.350 回答