.net - definicion - "Ya hay un DataReader abierto..." ¿Reutilizar o desechar conexiones de base de datos?
conexion a base de datos definicion (1)
Es evidente que está utilizando una única conexión global y aparentemente la está dejando abierta. Como se ha mencionado, no debe reutilizar ni 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 están cerrando y desechando. cual debería ser. La eliminación no solo evita que su aplicación pierda recursos, sino que este tipo de error no puede ocurrir al usar objetos DB creados recientemente para cada tarea.
Conexiones
Como hay giros involucrados en su creación, 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 de Uso para que se elimine:
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 dispone al final del bloque.
En general, cualquier cosa que tenga un método
Dispose
puede y debe usarse en un bloque
Using
para garantizar que se elimine.
Esto
incluiría
el
MemoryStream
y la
Image
utilizados en su código.
Using
bloques se puede "apilar" 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:
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.
Por favor, ayuda ... Cuando selecciono datos de la tabla Mysql, muestra "Ya hay un DataReader abierto asociado con esta conexión que debe cerrarse primero. Vb.net"
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 siguiente, 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