MySql.Data.dll中出现“MySql.Data.MySqlClient.MySqlException”类型的异常,但未在用户代码中处理

时间:2015-02-03 20:31:26

标签: c# mysql datareader

我不断收到以下错误消息:

  

发生了'MySql.Data.MySqlClient.MySqlException'类型的异常   在MySql.Data.dll中但未在用户代码中处理

     

其他信息:已经有一个开放的DataReader关联   使用此连接必须先关闭。

每次运行代码时,在da.Fill(dtCounts);

。有谁知道它的原因?

出于某种原因,S / O不允许我粘贴我的代码,因此我已将其上传到此处:http://pastebin.com/LCnTBVY4

编辑:就是这样:

public static void RefreshPlot()
{        
    string query = "SELECT Count(*) AS count, plot_id FROM booking WHERE postcode=@postcode AND " +
                   "status='open' GROUP BY plot_id";
    var cmd = new MySqlCommand(query, DbConnect.Connection);
    cmd.Parameters.AddWithValue(("@postcode"), DbConnect.Plot);

    var da = new MySqlDataAdapter(cmd);
    var dtCounts = new DataTable();
    da.Fill(dtCounts);

    if (dtCounts.Rows.Count > 0)
    {
        query = "UPDATE plot SET jobs = @jobCount WHERE plot_id = @plotID AND postcode=@postcode;";

        query += "UPDATE plot " +
                 "LEFT JOIN booking " +
                 "ON plot.plot_id = booking.plot_id " +
                 "SET plot.jobs = 0 " +
                 "WHERE plot.postcode=@postcode " +
                 "AND booking.plot_id IS NULL;";

        query += "update plot p " +
                 "inner join " +
                 "(select sum(case when status = 'Open' then 1 else 0 end) cnt, plot_id " +
                 "from booking group by plot_id) p2 on p.plot_id = p2.plot_id " +
                 "set p.jobs = p2.cnt;";

        cmd = new MySqlCommand(query, DbConnect.Connection);
        foreach (DataRow row in dtCounts.Rows)
        {
            cmd.Parameters.Clear();
            cmd.Parameters.AddWithValue(("@postcode"), DbConnect.Plot);
            cmd.Parameters.AddWithValue("@jobCount", int.Parse(row["count"].ToString()));
            cmd.Parameters.AddWithValue("@plotID", int.Parse(row["plot_id"].ToString()));
            cmd.ExecuteNonQuery();               
        }
    }
    else if ((dtCounts.Rows.Count == 0))
    {
        query = "UPDATE plot SET jobs=0 WHERE postcode=@postcode;";
        cmd = new MySqlCommand(query, DbConnect.Connection);
        cmd.Parameters.AddWithValue(("@postcode"), DbConnect.Plot);
        cmd.ExecuteNonQuery();
    }
}

1 个答案:

答案 0 :(得分:1)

尝试在每个新的MySqlCommand和Adapter上使用using语句来处理资源。

例如:

var dtCounts = new DataTable();
using (var cmd = new MySqlCommand(query, DbConnect.Connection))
{
     cmd.Parameters.AddWithValue(("@postcode"), DbConnect.Plot);

     using (var da = new MySqlDataAdapter(cmd))
     {
          da.Fill(dtCounts);
     }
}

您的连接中有一个未关闭的打开的数据加载器。

也许你在其他地方有一些使用相同连接的代码。 在任何地方使用using语句,然后关闭它们。

为了安全起见,您可以创建新连接。