1

私はtry catch connection is already openクラスメソッドからそれを閉じたときに次のようにコードでエラーを示す C# と My メソッドを初めて使用し、フォームがエラーを取得します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);
        }

    }
4

3 に答える 3

3

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);
    }
}
于 2016-11-29T07:00:44.423 に答える
0

接続を閉じるには常に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();
                }
            }       

        }
于 2016-11-29T07:36:48.320 に答える