MySqlDataReader закрыть соединение

Это мой код для выбора данных из таблицы в MySql:

            MySqlDataReader msdr;

            MySqlConnection connect = new MySqlConnection(connectionStringMySql);
            MySqlCommand cmd = new MySqlCommand();

            string commandLine = "SELECT id,token FROM Table WHERE id = @id AND token = @token;";

            cmd.CommandText = commandLine;

            cmd.Parameters.AddWithValue("@id", id);
            cmd.Parameters.AddWithValue("@token", token);

            cmd.Connection = connect;
            cmd.Connection.Open();

            msdr = cmd.ExecuteReader();

            //do stuff.....

            msdr.Close();
            cmd.Connection.Close();

Как видите, я закрываю эти два:

        msdr.Close();
        cmd.Connection.Close();

И я хочу спросить, нужно ли мне закрыть эти два? или можно закрыть только cmd.Connection.Close();

Причина, по которой я спросил об этом, потому что иногда я получаю эту ошибку, когда пытаюсь выбрать данные в таблице: Details: MySql.Data.MySqlClient.MySqlException: Too many connections

И я хочу знать, не потому ли это, что я не закрываю эти соединения.


person YosiFZ    schedule 02.06.2013    source источник


Ответы (2)


Лучшая кодировка для этого следующая

using(MySqlConnection connect = new MySqlConnection(connectionStringMySql))
using(MySqlCommand cmd = new MySqlCommand())
{
    string commandLine = "SELECT id,token FROM Table WHERE id = @id AND token = @token;";
    cmd.CommandText = commandLine;

    cmd.Parameters.AddWithValue("@id", id);
    cmd.Parameters.AddWithValue("@token", token);

    cmd.Connection = connect;
    cmd.Connection.Open();

    using(msdr = cmd.ExecuteReader())
    {

         //do stuff.....
    } // <- here the DataReader is closed and disposed.

}  // <- here at the closing brace the connection is closed and disposed as well the command

инструкция using будет держать ваше соединение закрытым и удаленным, а также командный объект. Нет необходимости явно вызывать Close для MySqlConnection или MySqlDataReader, потому что оператор using сделает это за вас ТАКЖЕ в случае возникновения исключений в вашем коде между открытием и закрытием соединения.

В вашем исходном коде достаточно закрыть соединение только один раз с помощью команды, средства чтения данных или самого соединения, потому что они работают с одним и тем же экземпляром объекта, но если у вас есть исключение, ваш код не может закрыть соединение, и, таким образом, вы рисковать проблемой «слишком много открытых подключений»

ОБНОВЛЕНИЕ для C# 8.0
В этой версии языка имеется небольшое, но полезное усовершенствование оператора using. Это называется с использованием объявления

С этим изменением приведенный выше код можно было бы написать, удалив фигурные скобки вокруг блоков использования.

using MySqlConnection connect = new MySqlConnection(connectionStringMySql);
using MySqlCommand cmd = new MySqlCommand();
string commandLine = "SELECT id,token FROM Table WHERE id = @id AND token = @token;";

.....
cmd.Connection.Open();
using msdr = cmd.ExecuteReader();
//do stuff.....

Когда метод выходит, все объявления использования будут действовать, чтобы удалить их соответствующую объявленную переменную.

person Steve    schedule 02.06.2013

если вы используете этот код в методе, лучше закрыть средство чтения данных, а также соединение с данными

person Monir Tarabishi    schedule 02.06.2013