Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关闭MySqlDataReader的问题_C#_Mysql - Fatal编程技术网

C# 关闭MySqlDataReader的问题

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

我在关闭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()上。

我会使用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()上;