2013-03-05 2 views
1

Я получаю сообщение об ошибкеСуществует уже открытая DataReader, связанная с этим соединением, которое должно быть закрыто первый VB.NET

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

Пожалуйста, помогите мне
Мой код:

Public Sub update_qty(ByVal qry1 As String) 
     Dim dr As MySqlDataReader 'SQLiteDataReader 
     Dim comm As MySqlCommand 'SQLiteCommand 


     Try 

      comm = New MySqlCommand(qry1, conn) 
      dr = comm.ExecuteReader() 
     Catch ex As Exception 
      MsgBox(ex.Message) 
     End Try 

     Do While dr.Read() 
      exe_query("call cargosys.paymentsAdd('" & var1 & "', " & dr("inNo") & ")") 
     Loop 

     dr.Close() 
End Sub 

Public Sub exe_query(ByVal qry As String) As String 

     Dim cmd As MySqlCommand 

     Try 
      cmd = New MySqlCommand(qry, conn) 
      cmd.ExecuteNonQuery() 


     Catch ex As MySqlException 
      MessageBox.Show(ex.ToString)  
     End Try 

End Sub 

ответ

4

Ваша проблема в том, что ваш код открыть DataReader, а затем выполнить SqlCommand когда DataReader чтения

Попробуйте изменить эту строку:

dr = comm.ExecuteReader() 

к:

dr = comm.ExecuteReader(CommandBehavior.CloseConnection) 

Подробнее: DataReader CommandBehavior

Или измените строку соединения на enabl e MARS (несколько активных наборов результатов). Этот параметр позволяет извлекать несколько наборов результатов только для чтения только для чтения в одном и том же соединении.

Например:

connectionString= 
"Data Source=.\SQLEXPRESS; 
AttachDbFilename=|DataDirectory|Northwind.MDF; 
Integrated Security=True; 
User Instance=True; 
MultipleActiveResultSets=True" 

Подробнее: MARS

EDIT

Поскольку MARS ключевое слово не поддерживается, попробуйте изменить свой код на этот:

Public Sub update_qty(ByVal qry1 As String) 
     Dim dr As MySqlDataReader 'SQLiteDataReader 
     Dim comm As MySqlCommand 'SQLiteCommand 


     Try 

      comm = New MySqlCommand(qry1, conn) 
      dr = comm.ExecuteReader() 
     Catch ex As Exception 
      MsgBox(ex.Message) 
     End Try 

     Dim myList As New List(Of String) 

     Do While dr.Read() 
      myList.Add("call cargosys.paymentsAdd('" & var1 & "', " & dr("inNo") & ")") 
     Loop 

     dr.Close() 
End Sub 

Public Sub exe_query(myList As List(Of String)) 

     Dim cmd As MySqlCommand 

     For Each query As String In myList 
      Try 
       cmd = New MySqlCommand(query, conn) 
       cmd.ExecuteNonQuery() 

      Catch ex As MySqlException 
       MessageBox.Show(ex.ToString)  
      End Try 
     Next 

End Sub 

Вместо этого делать DataReader.Read ->SqlCommand.ExecuteNonQuery, этот код сначала будет считывать все данные, а затем запускать SqlCommand.ExecuteNonQuery.

+1

Я изменил, что до сих пор я получаю ту же ошибку – imsome1

+0

я просто обновил свой ответ –

+0

Я использую Mysql, что ключевое слово не поддерживается – imsome1

Смежные вопросы

 Смежные вопросы