我在关闭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()上
发布于 2011-01-26 23:48:35
这可能与共享静态连接、命令和读取器对象有关。即使这不是这个特定问题的原因,也是一个非常好的主意。
您应该使用本地连接、命令和读取器变量。尽可能晚地创建它们;尽可能早地关闭它们。
试着这样做:
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
}
}
}
}发布于 2011-01-26 23:38:58
我会使用Using关键字:
Using dr As MySqlDataReader = cmd.ExecuteReader()
...
End Using(很抱歉使用VB语法)
编辑:如果在调用Close之前对命令调用Cancel,您可能会获得更快的关闭操作。无论如何,你关闭的行为是一个奇怪的问题。
dr.Cancel();
dr.Close();
cn.Close();edit2:我做了更多的研究,我发现如果你调用Cancel,问题就会解决,原因是你的"break“指令。来源:http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=610
“程序挂起的原因是SqlDataReader.Close方法填充了输出参数、返回值和RecordsAffected的值。如果您试图在读取所有记录之前关闭读取器,Close将尝试读取所有数据并填充这些值。如果您不关心这些值-如果您要退出read循环,则应该在调用Close之前取消底层命令。在上述情况下,您要做的是在退出循环之前调用command.Cancel。”
https://stackoverflow.com/questions/4806418
复制相似问题