【问题标题】:How to manage the mysql connection in correct way without getting a error如何以正确的方式管理mysql连接而不会出错
【发布时间】:2016-11-29 06:52:18
【问题描述】:

我是 C# 新手,我的方法在 try catch connection is already open 代码中显示错误如下,当我从 Class 方法关闭它时,Form 收到错误 invalid connection。在这里,如果将所有代码都放在 FORM 中,它就可以工作。但在这里我得到MysqlDataReader 作为返回值。我该如何解决这个错误。

   //select all categories
    public MySqlDataReader SelectCategory() {

        try
        {
            MySqlCommand cmd = connection.CreateCommand();
            cmd.CommandText = "SELECT * FROM categories WHERE online = 1";

            connection.Open();
            MySqlDataReader categories = cmd.ExecuteReader();
            return categories;
        }

        catch (Exception ex) {
            MessageBox.Show(ex.Message);
            return null;
        }


    }

表格

    public void show()
    {
        MySqlDataReader rd = db.SelectCategory();

        try
        {
            while (rd.Read())
            {
                listBox1.Items.Add(rd.GetString(1));
            }
        }

        catch (Exception ex) {
            MessageBox.Show(ex.Message);
        }

    }

【问题讨论】:

  • 你从来不关闭连接,为什么每次都打开呢?而回头客也不是一件好事。返回数据。你甚至永远不会关闭阅读器。
  • 我对此一无所知..
  • 你在哪里定义变量connection
  • 我有一个类在那里连接定义为名副其实
  • ` public DBConnect() { Initialize(); ; } 私人无效初始化(){服务器=“本地主机”;数据库=“pos3”; uid = "根";密码 = "";字符串连接字符串;连接字符串=“服务器=”+服务器+“;” +“数据库=”+数据库+“;” + "UID=" + uid + ";" + "密码=" + 密码 + ";";连接 = 新的 MySqlConnection(connectionString); }`

标签: c# mysql .net database-connection mysqldatareader


【解决方案1】:

我会使用using,它关心处理变量和关闭连接。

类:

public List<string> SelectCategory()
{
    List<string> result = new List<string>();
    string Command = "SELECT * FROM categories WHERE online = 1";
    using (MySqlConnection mConnection = new MySqlConnection(ConnectionString))
    {
        mConnection.Open();
        using (MySqlCommand cmd = new MySqlCommand(Command, mConnection))
        {
            using (MySqlDataReader reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {                        
                    result.Add(reader.GetString(1));
                }
            }
        }
    }
    return result;
}

表格:

public void show()
{
    try
    {
        foreach(string item in SelectCategory())
        {
            listBox1.Items.Add(item);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

【讨论】:

  • 旁注 - 为了减少开销,我会在您的声明中只选择所需的列
  • 我在你的回答中也看到了......这是什么意思List&lt;string&gt;请帮助
  • 我没有使用string Command = "SELECT * FROM categories WHERE online = 1"; using (MySqlConnection mConnection = new MySqlConnection(ConnectionString)),但我在返回之前关闭了连接..它正在工作
  • 不客气,using 正在为您关闭连接。 show() 中的异常处理应该足够了
  • 知道了...谢谢
【解决方案2】:

DataReader 是用于从数据库检索数据的例外情况,它始终需要打开连接才能从 DataReader 获取值。在您的情况下,您将 MySqlDataReader 传递给调用方法,因此您无法从被调用方法关闭连接,因为阅读器需要打开的连接。所以你的可能性是在关闭DataReader 后关闭连接。

您可能面临的另一个问题是连接问题(您当前的问题),从您的代码中可以清楚地看出您没有关闭连接,所以当您第一次调用该方法时,一切都会好起来的。当第二次调用触发连接的当前状态时,连接的当前状态将打开,因此当您尝试重新打开连接时它会抛出此类异常。

别担心,您可以使用以下任一方法来解决问题(我不确定这些建议是否对这个社区有效,如果不是,请见谅)

  • 将您的 UI 控件传递给类方法并将项目添加到列表中

在这种情况下,该方法是在另一个类中定义的,因此无法在其中使用 UI 项,因此更好的选择是将 UI 元素、ListBox 传递给该方法并使用阅读器填充它。为此,代码将如下所示:

public MySqlDataReader SelectCategory(ListBox listBox1) 
{

  // fubo's answer here

}
  • 检查连接状态后生成关闭连接的方法,并在while完成迭代时调用该方法。

调用方法如下:

   try
    {
        using (MySqlDataReader reader = db.SelectCategory())
        {
            while (reader.Read())
            {
                listBox1.Items.Add(reader.GetString(1));
            }
        }
        db.CloseConnection(); // will be the method to close the connection
    }
  • 使用 DataTable 代替 DataReader : 将数据获取到 DataTable,然后使用该 DataTable 绑定所需的列表

【讨论】:

  • @KBK : 酷.. 总是很乐意帮助你
【解决方案3】:

总是使用 finally 来关闭你的连接,无论发生什么你必须在打开后关闭你的连接。

    public MySqlDataReader SelectCategory() {

            try
            {
                MySqlCommand cmd = connection.CreateCommand();
                cmd.CommandText = "SELECT * FROM categories WHERE online = 1";

                connection.Open();
                MySqlDataReader categories = cmd.ExecuteReader();
                return categories;
            }        
            catch (Exception ex) {
                MessageBox.Show(ex.Message);
                return null;
            }
            finally
            {
                if (connection != null && connection.State == ConnectionState.Open)
                {
                    connection.Close();
                    connection.Dispose();
                }
            }       

        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    相关资源
    最近更新 更多