Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以正确的方式管理mysql连接而不出错_C#_Mysql_.net_Database Connection_Mysqldatareader - Fatal编程技术网

C# 如何以正确的方式管理mysql连接而不出错

C# 如何以正确的方式管理mysql连接而不出错,c#,mysql,.net,database-connection,mysqldatareader,C#,Mysql,.net,Database Connection,Mysqldatareader,我是C#新手,我的方法显示了try catch连接中的一个错误,已经打开了代码,如下所示,当我从类方法关闭它时,表单获取错误无效连接。在这里,如果把所有的代码都放在它工作的形式中。但是这里我得到了MysqlDataReader作为返回值。如何解决此错误 阶级 形式 我会使用using,它关心如何处理变量和关闭连接 类别: public List<string> SelectCategory() { List<string> result = new List<

我是C#新手,我的方法显示了
try catch
连接中的一个错误,已经打开了
代码,如下所示,当我从类方法关闭它时,表单获取错误
无效连接
。在这里,如果把所有的代码都放在它工作的形式中。但是这里我得到了
MysqlDataReader
作为返回值。如何解决此错误

阶级

形式


我会使用
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;
}

我会使用
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;
}

DataReader
是用于从数据库检索数据的例外情况,它总是需要打开连接才能从DataReader获取值。在本例中,您正在将
MySqlDataReader
传递给调用方法,因此无法从被调用方法关闭连接,因为reader需要打开的连接。因此,您可以在关闭
DataReader
后关闭连接

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

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

  • 将UI控件传递给class方法,并将项目添加到列表中
在这种情况下,该方法是在另一个类中定义的,因此不可能在其中使用UI项,因此更好的选择是将UI元素、列表框传递给该方法,并使用读取器填充它。为此,代码如下所示:

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: 将数据获取到数据表中,然后使用该数据表绑定所需列表

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

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

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

  • 将UI控件传递给class方法,并将项目添加到列表中
在这种情况下,该方法是在另一个类中定义的,因此不可能在其中使用UI项,因此更好的选择是将UI元素、列表框传递给该方法,并使用读取器填充它。为此,代码如下所示:

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: 将数据获取到数据表中,然后使用该数据表绑定所需列表

始终使用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();
                }
            }       

        }

始终使用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();
                }
            }       

        }

你从未关闭过连接,为什么每次都要打开它?而读者归来也不是一件好事。返回数据。你甚至从未关闭过读卡器。我对此一无所知..你在哪里定义变量
连接
?我在那里有一个类连接,它被定义为一个真正的`public DBConnect(){Initialize();}private void Initialize(){server=“localhost”;database=“pos3”;uid=“root”;password=“;string connectionString;connectionString=“SERVER=“+SERVER+”;“+”DATABASE=“+DATABASE+”;“+”uid=“+uid+”;“+”password=“+password+”;”;connection=new MySqlConnection(connectionString);}`您永远不会关闭连接,那你为什么每次都打开它?而读者归来也不是一件好事。返回数据。你甚至从未关闭过读卡器。我对此一无所知..你在哪里定义变量
连接
?我在那里有一个类连接,它被定义为一个真正的`public DBConnect(){Initialize();}private void Initialize(){server=“localhost”;database=“pos3”;uid=“root”;password=“;string connectionString;connectionString=“SERVER=“+SERVER+”;“+”DATABASE=“+DATABASE+”;“+”uid=“+uid+”;“+”password=“+password+”;”;connection=new MySqlConnection(connectionString);