题
当尝试使用 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旨在用于一次性枚举您返回的数据。一旦你完成了一次循环结果,对象就完成了它的任务。以下是一些解决此问题的想法,其中一个或多个可以根据您的需求为您解决此问题:
-
重新执行查询以在需要时生成另一个SqlDataReader
-
不使用SqlDataReader,而是将原始查询的结果存储到System.Data.DataTable中,然后您可以根据需要重新读取和操作数据。
醇>
希望这有帮助!
亚当
其他提示
由于datareader读入信息,因此使用块在将其值赋给变量后立即关闭与读取器的连接。 这是一篇文章,向您展示一些代码示例,这些代码可能会将您带到您需要的位置。
关键是当试图从阅读器读取时必须打开连接。
解释如下:
这是因为,您已经在调试器中循环了一次阅读器(第一次扩展视图时)。这就是阅读器的工作方式,据我所知,除了重新执行选项之外,没有办法重置阅读器从头开始再次阅读:
你只需要再次运行
cmd.ExecuteReader();
行(右键单击源,并使用“ SET NEXT语句”菜单选项)。
这是数据读取器的行为。如果你已经循环过了,就无法返回。您必须再次执行该命令并检索新的命令。
如果您需要在关闭阅读器后使用数据,您可以选择使用 Typed DataSet
, ,或无类型的 DataSet
正如 Adam 中所指定的 回答.
顺便说一句,这里有一些 optimizations
你可以做:
- 将阅读器移至
Connection
使用块在使用后将其脱离范围(一旦您出现了使用块,连接将关闭,并且您将无法使用它,因此将其留在外面是没有意义的) - 跑步
ExecuteReader
在另一个using
块(因为它实现了IDisposable
)并对 Sql 执行相同的操作Command
(相同IDisposable
界面) - 不要从数据库中检索所有字段