Уже есть открытый DataReader, связанный с этим подключением, который должен быть закрыт первым - PullRequest
2 голосов
/ 02 апреля 2011

Я использую Visual Studio 2010 (C #) с mysqlConnector, и все, кажется, в порядке.Однако, когда я пытаюсь запросить что-то с сервера, я получаю эту ошибку:

«Уже существует открытый DataReader, связанный с этим соединением, который должен быть закрыт первым.»

Это мой код:

gc.connect();

List<Conseiller> conseillers = gc.getAllConseillers();

--

public void connect() 
{
    string connStr = "SERVER=localhost;UID=root;DATABASE=Projet;Password=root";
    oConn = new MySqlConnection(connStr);

    try 
    {
        oConn.Open();
        Console.WriteLine("Successfully connected to the data base");
    } 
    catch (OdbcException caugth) 
    {
        /* Traitement de l'erreur */
        Console.WriteLine(caugth.Message);
    }
}

-- 

public List<Conseiller> getAllConseillers()
{
    MySqlCommand oComm = oConn.CreateCommand();

    oComm = oConn.CreateCommand();

    Console.WriteLine("SELECT * FROM conseillers");
    oComm.CommandText = "SELECT * FROM conseillers";

    MySqlDataReader oReader = oComm.ExecuteReader(); // Error here
}

Где я не прав?

Ответы [ 3 ]

1 голос
/ 02 апреля 2011

Несколько предложений, которые могут помочь:

Во-первых, в приведенном выше коде вы дважды вызывали CreateCommand, и вам не нужно.

Секон, вы можете создать свою Команду немного по-другому, чтобы ее было легче читать:

MySqlCommand oComm = new MySqlCommand("Select * from conseillers", oConn);

затем вызовите ExecuteReader.

В-третьих, ваш код выше не отображается, когда соединение открыто. Вы уверены, что это открыто? Вы уверены, что еще не вызывали устройство чтения данных с открытым соединением и не закрывали его?

В-четвертых, вы всегда должны открывать соединение как можно позже и закрывать его как можно раньше. Код, который у вас есть, похоже, что вы собираетесь открыть соединение и оставить его открытым, но я не совсем уверен в ваших намерениях.

Я бы предложил использовать синтаксис Using:

Using connection As New SqlConnection(connectionString)
        Dim command As New SqlCommand(queryString, connection)
        connection.Open()
        Dim reader As SqlDataReader = command.ExecuteReader()
        Try
            While reader.Read()
                Console.WriteLine(String.Format("{0}, {1}", _
                    reader(0), reader(1)))
            End While
        Finally
            ' Always call Close when done reading.
            reader.Close()
        End Try
    End Using

Измените приведенный выше код для вашей ситуации ....

1 голос
/ 02 апреля 2011

не пытайтесь отделить соединение от полученных данных.Призыв к открытию может вообще не идти в базу данных, и в этот момент вы не обнаружите проблем.Обратите внимание на оператор using, чтобы закрыть соединение.добавить SEH по мере необходимости

List<Conseiller> conseillers = gc.getAllConseillers();

public void getAll() {
  string connStr = "SERVER=localhost;UID=root;DATABASE=Projet;Password=root";
  using (oConn = new MySqlConnection(connStr))
  using (MySqlCommand oComm = oConn.CreateCommand())
  {
    oConn.Open();
    oComm.CommandText = "SELECT * FROM conseillers";

    MySqlDataReader oReader = oComm.ExecuteReader(); // no Error here
    // user reader here
    } catch (OdbcException caugth) {
        /* Traitement de l'erreur */
        Console.WriteLine(caugth.Message);
    }
 }
1 голос
/ 02 апреля 2011

Вы не утилизируете свои объекты, что в основном означает, что ваш предыдущий вызов getAllConseillers или аналогичного метода открыл читатель данных, который все еще открыт.

Следующие объекты в вашем вопросе являются одноразовыми(т.е. реализует IDisposable ), вы должны избавиться от них всех:

  1. MySqlConnection
  2. MySqlCommand
  3. MySqlDataReader

По сути, я бы изменил код, как показано ниже:

using (var gc = new Whatever())
{
    gc.connect();
    List<Conseiller> conseillers = gc.getAllConseillers();
}

--

public void connect()
{
    string connStr = "SERVER=localhost;UID=root;DATABASE=Projet;Password=root";
    oConn = new MySqlConnection(connStr);
    try
    {
        oConn.Open();
        Console.WriteLine("Successfully connected to the data base");
    }
    catch (OdbcException ex)
    {
        /* Traitement de l'erreur */
        Console.WriteLine(ex.Message);
        oConn.Dispose();
        oConn = null;
        // optional: throw;
    }
}

-- 

public List<Conseiller> getAllConseillers()
{
    using (MySqlCommand oComm = oConn.CreateCommand())
    {
        Console.WriteLine("SELECT * FROM conseillers");
        oComm.CommandText = "SELECT * FROM conseillers";
        using (MySqlDataReader oReader = oComm.ExecuteReader()) // No error here
        {
            // process the result in oReader here
            return ...;
        }
        ...
    }
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...