当尝试使用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连接器
- 尝试在两台不同的机器上排除任何本地错误
到目前为止,没有任何工作。
如果有人能提供任何想法或建议,我们将非常感激。
答案 0 :(得分:2)
据我所知,SqlDataReader旨在用于一次性枚举您返回的数据。一旦你完成了一次循环结果,对象就完成了它的任务。以下是一些解决此问题的想法,其中一个或多个可以根据您的需求为您解决此问题:
重新执行查询以在需要时生成另一个SqlDataReader
不使用SqlDataReader,而是将原始查询的结果存储到System.Data.DataTable中,然后您可以根据需要重新读取和操作数据。
希望这有帮助!
亚当
答案 1 :(得分:0)
由于datareader读入信息,因此使用块在将其值赋给变量后立即关闭与读取器的连接。 Here is an article向您展示了一些代码示例,可能会将您带到您需要的位置。
关键是当试图从阅读器读取时必须打开连接。
答案 2 :(得分:0)
以下是解释:
这是因为,您已经在调试器中浏览了一次读取器(第一次展开视图时)。这是读者的工作方式,据我所知,除了重新执行选项之外,没有办法重置读者从头开始再读,除了重新执行选项:
你只需要再次运行
cmd.ExecuteReader();
行(右) 单击源并使用“设置 下一个声明“菜单选项”。
这是数据读者的行为。如果你已经通过它,你就不能回去了。您必须再次执行该命令并检索一个新命令。
如果您在关闭阅读器后需要使用数据,则可以选择使用Typed DataSet
或Adam answer中指定的无类型DataSet
。
顺便说一句,这里有一些optimizations
:
Connection
使用块来制作它
完成后超出范围
使用它(一旦你不使用它
阻止,连接将被关闭
并且无论如何你都无法使用它,所以把它留在外面就没有意义了。)ExecuteReader
另一个using
块(因为它实现了IDisposable
)并使用Sql Command
(相同的IDisposable
接口)执行相同的操作