关闭MySqlDataReader的问题

时间:2011-01-26 15:35:48

标签: c# 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()

2 个答案:

答案 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
             }
         }
     }
}