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?

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top