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?

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top