Não é possível fechar OleDbDataReader para banco de dados Sybase em VB.NET
-
02-07-2019 - |
Pergunta
Eu não parecem ser capazes de fechar o objeto OleDbDataReader depois de ler dados a partir dele. Aqui está o 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()
O aplicativo de console só trava no ponto em que eu tento fechar o leitor. Abrir e fechar uma conexão não é um problema, portanto, alguém tem alguma idéia para o que pode estar causando isso?
Solução
Eu encontrei a resposta!
Antes
drSyBase.Close()
Você precisa chamar o método do objeto do comando cancel
cmdSyBase.Cancel()
Eu acredito que isso pode ser específico para bancos de dados Sybase
Outras dicas
Este é um tiro longo, mas tente retirar o seu linhas .Fechar () e .Dispose () em um bloco Finalmente da tentativa. Como esta:
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
Tem sido um tempo desde que eu usei VB.NET, mas a forma mais segura de lidar com isso em C # é usar um " usando " declaração.
É como um implícita try-catch e faz-se de todos os recursos estão fechadas / cancelada e descartado quando o "usando" termina.
using (OleDb.OleDbConnection connection = new OleDb.OleDbConnection(connectionString))
{
DoDataAccessStuff();
} // Your resource(s) are killed, disposed and all that
Atualizar : Encontrado um link sobre Usando declaração em VB.NET 2.0 , espero que ajude.
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