“Já existe um DataReader aberto…” Reutilizar ou descartar conexões de database?

Por favor me ajude …. Quando eu selecionar dados da tabela Mysql mostrando “Já existe um DataReader associado a esta conexão que deve ser fechado primeiro. Vb.netErro ao mostrar ..

Private Sub cmbJobCategoryVisa_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbJobCategoryVisa.SelectedIndexChanged ''" Dim MyCommand As New MySqlCommand("SELECT jobcategorycode FROM jobcategory WHERE jobcategory='" & Me.cmbJobCategoryVisa.SelectedItem & "'", MyConnection) Dim MyReader As MySqlDataReader = MyCommand.ExecuteReader While MyReader.Read If MyReader.HasRows = True Then Me.txtJobCategoryCodeVisa.Text = MyReader("jobcategorycode") End If End While MyReader.Close() MyCommand.Dispose() End Sub 

” ‘no momento da execução do código abaixo ,,, o erro de imagem está sendo exibido

  Private Sub txtEmpNo_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtEmpNo.Validating Dim MyCommand5 As New MySqlCommand("SELECT * FROM employeesmaster WHERE empno='" & Me.txtEmpNo.Text & "'", MyConnection) Dim MyDataReader5 As MySqlDataReader = MyCommand5.ExecuteReader If MyDataReader5.HasRows = True Then While MyDataReader5.Read Me.txtEmpName.Text = MyDataReader5("name") Me.cmbNationality.Text = MyDataReader5("nationality") Me.cmbJobCategoryVisa.Text = MyDataReader5("jobcategoryvisa") If Not IsDBNull(MyDataReader5("image")) Then Dim ImageData As Byte() = DirectCast(MyDataReader5("image"), Byte()) Dim MemoryStream As New IO.MemoryStream(ImageData) Me.pbxEmpImage.Image = Image.FromStream(MemoryStream) Else Me.pbxEmpImage.Image = Nothing End If End While Else End If MyDataReader5.Close() MyCommand5.Dispose() End Sub 

   

É evidente que você está usando uma única conexão global e, aparentemente, deixando-a aberta. Como já foi mencionado, você não deve reutilizar ou armazenar sua conexão. As conexões são baratas para serem criadas e o .NET é otimizado para criá-las conforme necessário.

Existem várias coisas no seu código que não estão sendo fechadas e descartadas. qual deveria ser. Eliminar não só evita que o seu aplicativo vaze resources, mas esse tipo de erro não pode acontecer usando objects de database criados recentemente para cada tarefa.

Conexões
Como há giros envolvidos na criação deles, você pode escrever uma function para criar (e talvez abrir) uma nova conexão e evitar ter que colar a string de conexão em todos os lugares. Aqui está um exemplo geral usando o OleDB:

 Public Function GetConnection(Optional usr As String = "admin", Optional pw As String = "") As OleDbConnection Dim conStr As String conStr = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};User Id={1};Password={2};", dbFile, usr, pw) Return New OleDbConnection(constr) End Function 

Using blocos
Use-o em um bloco Using para que seja descartado:

 Using con As OleDb.OleDbConnection = GetConnection() Using cmd As New OleDbCommand(sql.Value, con) con.Open() Using rdr As OleDbDataReader = cmd.ExecuteReader() ' do stuff End Using ' close and dispose of reader End Using ' close and dispose of command End Using ' close, dispose of the Connection objects 

Cada instrução Using cria um novo object de destino e o coloca no final do bloco.

Em geral, qualquer coisa que tenha um método Dispose pode e deve ser usado em um bloco Using para garantir que ele seja descartado. Isso inclui o MemoryStream e a Image usados ​​no seu código.

Using blocos pode ser “empilhada” para especificar mais de um object e reduzir o recuo (observe a vírgula após o final da primeira linha):

 Using con As OleDb.OleDbConnection = GetConnection(), cmd As New OleDbCommand(sql.Value, con) con.Open() ... End Using ' close and dispose of Connection and Command 

Para mais informações, veja:

  • Usando a declaração
  • Pool de Conexões
  • Como: descartar um recurso do sistema

can u pls convert this code to Mysql connection... my connection string is...

Para conexão básica do MySQL:

 ' module level declaration Private MySQLDBase as String = "officeone" Function GetConnection(Optional usr As String = "root", Optional pw As String = "123456") As MySqlConnection Dim conStr As String conStr = String.Format("Server=localhost;Port=3306;Database={0};Uid={1}; Pwd={2};", MySQLDBase, usr, pw) Return New MySqlConnection(constr) End Function 

Pessoalmente para o MySql, eu uso uma class e um ConnectionStringBuilder no método. Existem muitas, muitas opções legais que uso, mas que diferem de projeto para projeto, como o database e o login padrão do aplicativo. O acima usa todos os padrões.