No se puede cerrar OledbDataReader a la base de datos Sybase en VB.NET
-
02-07-2019 - |
Pregunta
Parece que no puedo cerrar el objeto OledbDataReader después de leer sus datos.Aquí está el código relevante:
Dim conSyBase As New OleDb.OleDbConnection("Provider=Sybase.ASEOLEDBProvider.2;Server Name=xx.xx.xx.xx;Server Port Address=5000;Initial Catalog=xxxxxxxxxx;User ID=xxxxxxxx;Password=xxxxxxxxx;")
conSyBase.Open()
Dim cmdSyBase As New OleDb.OleDbCommand("MySQLStatement", conSyBase)
Dim drSyBase As OleDb.OleDbDataReader = cmdSyBase.ExecuteReader
Try
While drSyBase.Read
/*Do some stuff with the data here */
End While
Catch ex As Exception
NotifyError(ex, "Read failed.")
End Try
drSyBase.Close() /* CODE HANGS HERE */
conSyBase.Close()
drSyBase.Dispose()
cmdSyBase.Dispose()
conSyBase.Dispose()
La aplicación de la consola simplemente se bloquea en el momento en que intento cerrar el lector.Abrir y cerrar una conexión no es un problema, por lo tanto, ¿alguien tiene alguna idea de lo que puede estar causando esto?
Solución
¡Encontré la respuesta!
Antes
drSyBase.Close()
Debes llamar al método cancelar del objeto Comando.
cmdSyBase.Cancel()
Creo que esto puede ser específico de las bases de datos Sybase.
Otros consejos
Esta es una posibilidad remota, pero intente mover las líneas .Close() y .Dispose() en un bloque Finalmente del Try.Como esto:
Dim conSyBase As New OleDb.OleDbConnection("Provider=Sybase.ASEOLEDBProvider.2;Server Name=xx.xx.xx.xx;Server Port Address=5000;Initial Catalog=xxxxxxxxxx;User ID=xxxxxxxx;Password=xxxxxxxxx;")
conSyBase.Open()
Dim cmdSyBase As New OleDb.OleDbCommand("MySQLStatement", conSyBase)
Dim drSyBase As OleDb.OleDbDataReader = cmdSyBase.ExecuteReader
Try
While drSyBase.Read
/*Do some stuff with the data here */
End While
Catch ex As Exception
NotifyError(ex, "Read failed.")
Finally
drSyBase.Close()
conSyBase.Close()
drSyBase.Dispose()
cmdSyBase.Dispose()
conSyBase.Dispose()
End Try
Ha pasado un tiempo desde que usé VB.NET, pero la forma más segura de manejar esto en C# es usar un "usando" declaración.
Es como un try-catch implícito y se asegura de que todos los recursos se cierren/cancelen y se eliminen cuando finalice el "uso".
using (OleDb.OleDbConnection connection = new OleDb.OleDbConnection(connectionString))
{
DoDataAccessStuff();
} // Your resource(s) are killed, disposed and all that
Actualizar:Encontré un enlace sobre Usando declaración en VB.NET 2.0, Espero eso ayude.
Using conSyBase As New OleDb.OleDbConnection("Provider=Sybase.ASEOLEDBProvider.2;Server Name=xx.xx.xx.xx;Server Port Address=5000;Initial Catalog=xxxxxxxxxx;User ID=xxxxxxxx;Password=xxxxxxxxx;"), _
cmdSyBase As New OleDb.OleDbCommand("MySQLStatement", conSyBase)
conSyBase.Open()
Dim drSyBase As OleDb.OleDbDataReader = cmdSyBase.ExecuteReader
Try
While drSyBase.Read()
'...'
End While
Catch ex As Exception
NotifyError(ex, "Read failed.")
End Try
cmdSyBase.Cancel()
End Using