Невозможно закрыть OledbDataReader для базы данных Sybase в VB.NET - PullRequest
1 голос
/ 24 сентября 2008

Кажется, я не могу закрыть объект OledbDataReader после чтения данных из него. Вот соответствующий код -

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()

Консольное приложение просто зависает в точке, в которой я пытаюсь закрыть ридер. Открытие и закрытие соединения не является проблемой, поэтому у кого-нибудь есть идеи, что может быть причиной этого?

Ответы [ 3 ]

3 голосов
/ 24 сентября 2008

Я нашел ответ!

До

drSyBase.Close()

Вам необходимо вызвать метод отмены объекта Command

cmdSyBase.Cancel()

Я считаю, что это может быть характерно для баз данных Sybase

0 голосов
/ 24 сентября 2008

Прошло много времени с тех пор, как я использовал VB.NET, но самый безопасный способ справиться с этим в C # - это использовать выражение " using ".

Это похоже на неявный try-catch , и он гарантирует, что все ресурсы закрыты / отменены и утилизированы, когда заканчивается "использование".

using (OleDb.OleDbConnection connection = new OleDb.OleDbConnection(connectionString)) 
{
    DoDataAccessStuff();
} // Your resource(s) are killed, disposed and all that

Обновление : Найдена ссылка о Использование оператора в VB.NET 2.0 , надеюсь, это поможет.

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
0 голосов
/ 24 сентября 2008

Это длинный выстрел, но попробуйте переместить строки .Close () и .Dispose () в блоке finally блока Try. Как это:


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
...