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

Posted

技术标签:

【中文标题】MySql.Data.dll 中出现“MySql.Data.MySqlClient.MySqlException”类型的异常,但未在用户代码中处理【英文标题】:An exception of type 'MySql.Data.MySqlClient.MySqlException' occurred in MySql.Data.dll but was not handled in user code 【发布时间】:2015-02-03 20:31:25 【问题描述】:

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

发生“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();
    

【问题讨论】:

我建议不要使用像DbConnect.Plot 这样的公共连接,如果它们是静态的则更是如此。为什么不创建使用它的连接实例,最好使用using-statement 确保它尽快关闭?可能相关:***.com/questions/9705637/… 谢谢蒂姆 - 现在让我感到困惑的是试图弄清楚我是否可以访问 ConnectionString(在 DbConnect 类中)。我怎样才能从 PlotComponent 类(如上所示)中做到这一点?我已经在pastebin.com/GMRN0tWq 上传了 DbConnect 课程。不确定我是否真的可以从 try catch 中得到它。你能帮忙吗? @methusaleh:为什么不能访问该类中的连接字符串?如果它是pulic static 并没有什么坏处,因为您不更改它,尽管我会使用也被缓存的应用程序设置。但是我担心的是static。不要那样做! 你的意思是public static MySqlConnection Connection?为什么它不应该是静态的?另外我不知道如何访问它(关于连接字符串 * 覆盖面 * 我在我的第一条评论中发布了一个链接,它可以更好地解释它。还有一个带有非静态连接和using-statement 的示例。 【参考方案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 语句,然后它们应该被关闭。

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

【讨论】:

以上是关于MySql.Data.dll 中出现“MySql.Data.MySqlClient.MySqlException”类型的异常,但未在用户代码中处理的主要内容,如果未能解决你的问题,请参考以下文章

c# 连接Mysql数据库

MySQL安装不了,怎么解决?

unity添加Mysql的dll以及发布的问题

.net 中连接mysql

C#中简单操作Mysql数据库

.net4.0使用Dapper操作MySql