“Ya hay un lector de datos abierto …” ¿Reutilizar o eliminar conexiones de base de datos?

Por favor, ayuda … Cuando selecciono datos de la tabla Mysql, aparece “Ya hay un lector de datos abierto asociado a esta conexión que debe cerrarse primero. Vb.netError al 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 

” ‘en el momento de la ejecución del código a continuación ,,, se muestra el error de imagen

  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 

Es evidente que está utilizando una única conexión global y aparentemente la está dejando abierta. Como se ha mencionado, no debe volver a usar o almacenar su conexión. Las conexiones son baratas de crear y .NET está optimizado para crearlas según sea necesario.

Hay varias cosas en su código que no se cierran ni eliminan. que debería ser La eliminación no solo evita que su aplicación pierda recursos, sino que este tipo de error no puede ocurrir utilizando objetos DB recién creados para cada tarea.

Conexiones
Dado que hay giros involucrados en crearlos, puede escribir una función para crear (y tal vez abrir) una nueva conexión y evitar tener que pegar la cadena de conexión en todas partes. Aquí hay un ejemplo general usando 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 bloques
Úselo en un bloque Using para que se deseche:

 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 instrucción Using crea un nuevo objeto de destino y lo descarta al final del bloque.

En general, cualquier cosa que tenga un método de Dispose puede y debe usarse en un bloque de Using para asegurar que se elimine. Esto incluiría el MemoryStream y la Image utilizados en su código.

Using bloques se puede “astackr” para especificar más de un objeto y reducir la sangría (tenga en cuenta la coma después del final de la primera línea):

 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 más información, ver:

  • Usando la statement
  • Agrupación de conexiones
  • Cómo: deshacerse de un recurso del sistema

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

Para la conexión básica de 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 

Personalmente para MySql, uso una clase y un ConnectionStringBuilder en el método. Hay muchas, muchas opciones interesantes que uso pero que difieren de un proyecto a otro, como la base de datos y el inicio de sesión predeterminado de la aplicación. Lo anterior usa todos los valores predeterminados.