我在关闭MySqlDataReader时遇到问题。似乎.Close()命令挂起。有谁知道怎么解决这个问题?
static void Main(string[] args)
{
MySqlConnection cn = new MySqlConnection("SERVER=svr;DATABASE=db;UID=uid;PASSWORD=pwd;");
cn.Open();
MySqlCommand cmd = new MySqlCommand("SELECT * FROM SOMETABLE", cn);
MySqlDataReader dr = cmd.ExecuteReader();
int ii = 0;
while (dr.Read())
{
Console.WriteLine(dr.GetValue(1).ToString());
if (ii++ > 10) break;
}
dr.Close();
cn.Close();
}
**注意:我已将代码更改为不使用静态对象。它仍然挂在.Close()
上答案 0 :(得分:2)
我会使用Using关键字:
Using dr As MySqlDataReader = cmd.ExecuteReader()
...
End Using
(抱歉VB语法)
编辑:如果在调用“关闭”之前调用“取消”命令,则可以更快地关闭操作。无论如何,你的关闭行为是一个奇怪的问题。
dr.Cancel();
dr.Close();
cn.Close();
edit2:做更多研究我发现如果你打电话取消就会解决问题,原因就是你的“休息”指令。资料来源:http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=610
“程序挂起的原因是SqlDataReader.Close方法填写输出参数,返回值和RecordsAffected的值。如果您尝试在读取所有记录之前关闭阅读器,请关闭尝试读取所有数据并填写这些值。如果您不关心这些值 - 如果您没有读取循环,则可能不会这样做,您应该在调用Close之前取消基础命令。在上面的例子中,你要做的是在退出循环之前调用command.Cancel。“
答案 1 :(得分:1)
此可能与共享静态连接,命令和读取器对象有关。即使这不是造成这个特殊问题的原因,也不要这样做是个好主意。
您应该使用本地连接,命令和读取器变量。尽可能晚地创建它们;尽早关闭它们。
请改为尝试:
static void Main(string[] args)
{
using (var conn = new MySqlConnection("..."))
using (var cmd = new MySqlCommand("...", conn))
{
conn.Open();
using (MySqlDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
// do something
}
}
}
}