MySqlDataReader:我关闭连接,但得到:已经有一个与此连接关联的打开的DataReader,必须先关闭它

pgx2nnw8  于 12个月前  发布在  Mysql
关注(0)|答案(2)|浏览(57)
private void startPoll()
    {

        System.Diagnostics.Debug.WriteLine("dbForm created");
         timer = new Timer(int.Parse(Properties.Settings.Default.DbPoll) * 1000);
        // ElapsedEventHandler OnEventExecution = null;
        timer.Elapsed += OnEventExecution;
        timer.Start();
        System.Diagnostics.Debug.WriteLine("Timer Started " + Properties.Settings.Default.DbPoll + " secs");

        string connectionString;
        // MySqlConnection conn;
        connectionString = "server=" + Properties.Settings.Default.DbServer + ";database=digital_passports;uid=" + Properties.Settings.Default.DbUser + ";pwd=" + Properties.Settings.Default.DbPass ;
        try
        {
            using (conn = new MySqlConnection(connectionString))
            {
                try
                {

                    conn.Open();
                    System.Diagnostics.Debug.WriteLine("Database Connection Connected");

                }
                catch (Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine("Database Connection Failed..." + ex);
                }

                var stm = "SELECT * from vtokenpool limit 10";

                using (var cmd = new MySqlCommand(stm, conn))
                {

                    // var version = cmd.ExecuteScalar().ToString();
                    //  System.Diagnostics.Debug.WriteLine($"MySQL version: {version}");
                    stateText.Text = "Running";
                    stateText.ForeColor = System.Drawing.Color.Green; ;

                    try
                    {
                        using (MySqlDataReader rdr = cmd.ExecuteReader())
                        {

                            while (rdr.Read())
                            {

                               System.Diagnostics.Debug.WriteLine(rdr[0] + " -- " + rdr[1]);

                                /*
                                object[] tempRow = new object[rdr.FieldCount];
                                for (int i = 0; i < rdr.FieldCount; i++)
                                {
                                    tempRow[i] = rdr[i];
                                }
                                dataList.Add(tempRow);
                                */
                            }
                            rdr.Close();
                            System.Diagnostics.Debug.WriteLine("Reader Closed");
                            conn.Close();
                            System.Diagnostics.Debug.WriteLine("Connection Closed");

                        }
                    }
                    catch (Exception ex)
                    {
                        System.Diagnostics.Debug.WriteLine(ex);
                    }

                }
            }
        }
        catch(Exception ex)
        {
            System.Diagnostics.Debug.WriteLine(ex);
        }

    }


我轮询一个数据库视图,我得到这个错误沿着
当另一个读取操作挂起时,无法调用ReadAsync方法。
我在代码中关闭了datareader和连接,并使用了using语句,但我在重复查询时得到了这些错误。
关于Aidan

643ylb08

643ylb081#

问题(或至少是“a”)在这里:

using (conn = new MySqlConnection(connectionString))

这将创建一个新的连接对象,但不会创建一个新的变量。这段代码只是在其他地方声明的现有conn变量之上进行赋值,在可能与其他代码共享的更高范围内。ReadAsync注解还表明我们正在使用异步代码(即使它不是本示例的一部分),这意味着其他代码可以与此代码同时运行-所有代码都查看相同的conn变量,但引用的连接对象从我们下面更改。
更糟糕的是,孤立的连接对象可能会一直处于打开状态,直到GC在将来某个不确定的时间赶上它们。
相反,每次都应该创建一个新变量:

using (var conn = new MySqlConnection(connectionString))

完成后,* 您甚至不需要手动调用conn.Close() *。using为您处理它。

tgabmvqs

tgabmvqs2#

您好,谢谢,这修复了错误消息,谢谢。但另一个问题是,消息的输出不同步,就像下面的任何想法,为什么在几轮之后?下面放出来

Database Connection Connected
60 -- q=7f76a8712d5d5507e9b4b2ce126051b6ee310246cc7499fa0acf2c386cfc90c1
51 -- q=5c5bdccc0545b4e7b6541c2ab32c92d1e2632205fc89ddeb037e27cbcb111d2b
     Reader Closed
52 -- q=acde8e3015b8c15e66fe0be128718355a3c6fe438732b719f51adb79ca46d7f2
     Timer Ended
51 -- q=5c5bdccc0545b4e7b6541c2ab32c92d1e2632205fc89ddeb037e27cbcb111d2b
      Timer Started 5 secs
52 -- q=acde8e3015b8c15e66fe0be128718355a3c6fe438732b719f51adb79ca46d7f2
53 -- q=0c5bf67caf9e5b73de261364b8c79f87b3b27c37613ab7f6a117e91e3454947a
53 -- q=0c5bf67caf9e5b73de261364b8c79f87b3b27c37613ab7f6a117e91e3454947a
     Database Connection Connected
54 -- q=06189a2e74841588d0b8a49bbc13f97f20170e2b4d1077382c5cff4a4c12940a
54 -- q=06189a2e74841588d0b8a49bbc13f97f20170e2b4d1077382c5cff4a4c12940a
55 -- q=0d1c26e055e45aa89c2dd24c0d17da6c069ef429da3e03fa2af30be36a115f89

相关问题