C# 关闭MySqlDataReader的问题
我在关闭MySqlDataReader时遇到问题。.Close()命令似乎挂起。有人知道怎么避开这件事吗C# 关闭MySqlDataReader的问题,c#,mysql,C#,Mysql,我在关闭MySqlDataReader时遇到问题。.Close()命令似乎挂起。有人知道怎么避开这件事吗 static void Main(string[] args) { MySqlConnection cn = new MySqlConnection("SERVER=svr;DATABASE=db;UID=uid;PASSWORD=pwd;"); cn.Open(); MySql
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()上。我会使用Using关键字:
Using dr As MySqlDataReader = cmd.ExecuteReader()
...
End Using
(很抱歉使用VB语法)
编辑:在调用Close之前,如果在命令上调用Cancel,可能会获得更快的关闭操作。无论如何,你的近亲的行为是一个奇怪的问题
dr.Cancel();
dr.Close();
cn.Close();
编辑2:做更多的研究,我发现如果你打电话取消,问题就会解决,原因是你的“中断”指令。资料来源:
程序挂起的原因是SqlDataReader.Close方法填充了输出参数、返回值和RecordsAffected的值。如果试图在读卡器读取所有记录之前关闭读卡器,close将尝试读取所有数据并填写这些值。如果您不关心这些值,并且如果您正在中断读取循环,则可能不关心这些值,那么应该在调用Close之前取消底层命令。在上述情况下,您要做的是在退出循环之前调用command.Cancel。“这可能与共享静态连接、command和reader对象有关。即使这不是此特定问题的原因,也最好不要这样做
您应该使用本地连接、命令和读取器变量。尽可能晚地创建它们;尽可能早地关闭它们
请尝试以下方法:
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
}
}
}
}
好的建议,但可能不是OP问题的解决方案。虽然通常是好的做法,但我不认为这会对这个特定问题产生什么影响-请解释一下好吗?@LukeH:这是完全正确的答案。Vulkanino解释了为什么
Close博士()< /代码>挂起。是的,他应该把所有的<代码> IDispose <代码>对象放在<代码>使用块,但是他应该考虑改变SQL查询,或者可能使用LINQ而不是使用<代码>破解< /代码>。@ JangB:现在可能是正确的答案,但是当我口头发表我的评论时,答案只包括第一部分(有效地只是)。我会使用Using关键字“)。vulkanino的编辑是在我的评论之后进行的。好吧,这两种方式都无所谓。它仍然挂在.Close()上;