Excepción: ya hay un DataReader abierto asociado a esta conexión que debe cerrarse primero

Tengo el siguiente código y estoy recibiendo una excepción:

Ya hay un DataReader abierto asociado con esta Connection que debe cerrarse primero.

Estoy usando Visual Studio 2010 / .Net 4.0 y MySQL para este proyecto. Básicamente, estoy tratando de ejecutar otra statement SQL mientras uso el lector de datos para hacer mi otra tarea. Recibo una excepción en la línea cmdInserttblProductFrance.ExecuteNonQuery();

 SQL = "Select * from tblProduct"; //Create Connection/Command/MySQLDataReader MySqlConnection myConnection = new MySqlConnection(cf.GetConnectionString()); myConnection.Open(); MySqlCommand myCommand = new MySqlCommand(SQL, myConnection); MySqlDataReader myReader = myCommand.ExecuteReader(); myCommand.Dispose(); if (myReader.HasRows) { int i = 0; // Always call Read before accessing data. while (myReader.Read()) { if (myReader["frProductid"].ToString() == "") //there is no productid exist for this item { strInsertSQL = "Insert Into tblProduct_temp (Productid) Values('this istest') "; MySqlCommand cmdInserttblProductFrance = new MySqlCommand(strInsertSQL, myConnection); cmdInserttblProductFrance.ExecuteNonQuery(); //<=====THIS LINE THROWS "C# mySQL There is already an open DataReader associated with this Connection which must be closed first." } } } 

Está utilizando la misma conexión para DataReader y ExecuteNonQuery . Esto no es compatible, de acuerdo con MSDN :

Tenga en cuenta que, si bien un DataReader está abierto, ese DataReader utiliza exclusivamente la conexión. No puede ejecutar ningún comando para Connection, incluida la creación de otro DataReader, hasta que se cierre el DataReader original.

Siempre, siempre, siempre coloque objetos desechables dentro de las declaraciones de uso. No veo cómo has instanciado tu DataReader pero deberías hacerlo así:

 using (Connection c = ...) { using (DataReader dr = ...) { //Work with dr in here. } } //Now the connection and reader have been closed and disposed. 

Ahora, para responder a su pregunta, el lector está utilizando la misma conexión que el comando en el que intenta ExecuteNonQuery . Debe usar una conexión separada ya que el DataReader mantiene la conexión abierta y lee los datos como los necesite.

Está intentando hacer una inserción (con ExecuteNonQuery() ) en una conexión SQL que ya utiliza este lector:

 while (myReader.Read()) 

Primero lea todos los valores en una lista, cierre el lector y luego haga la inserción, o use una nueva conexión SQL.

El problema con el que se está enfrentando es que está iniciando un segundo MySqlCommand mientras sigue leyendo datos con el DataReader . El conector MySQL solo permite una consulta simultánea. Necesita leer los datos en una estructura, cerrar el lector y luego procesar los datos. Lamentablemente, no puede procesar los datos tal como se leen si su procesamiento implica más consultas SQL.

Tienes que cerrar el lector encima de tu condición de otro.

Como dijo David Suárez, estás tratando de leer en paralelo. Tuve el mismo problema y encontré una solución rápida y fácil.

Antes de comenzar tu lectura haz un bucle de espera

 private void WaitForEndOfRead() { int count = 0; while (_connection.State == ConnectionState.Fetching) { Thread.Sleep(1000); count++; if (count == 10) { break; } } } 

Luego, antes de iniciar su SqlCommand, llame a la función anterior. Algo como:

 using (SqlCommand command = new SqlCommand("GetData", _connection)) { command.CommandType = CommandType.StoredProcedure; using (SqlDataReader dr = command.ExecuteReader()) { // do your thing here } }