Не удалось закрыть OleDbDataReader для базы данных Sybase в VB.NET
-
02-07-2019 - |
Вопрос
Кажется, я не могу закрыть объект 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()
Консольное приложение просто зависает в тот момент, когда я пытаюсь закрыть программу чтения.Открытие и закрытие соединения не является проблемой, поэтому есть ли у кого-нибудь какие-либо идеи относительно того, что может быть причиной этого?
Решение
Я нашел ответ!
До того, как
drSyBase.Close()
Вам нужно вызвать метод cancel объекта Command
cmdSyBase.Cancel()
Я полагаю, что это может быть специфично для баз данных Sybase
Другие советы
Это рискованный шаг, но попробуйте переместить строки .Close() и .Dispose() в блок Finally попытки.Вот так:
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
Прошло много времени с тех пор, как я использовал VB.NET, но самый безопасный способ справиться с этим в C # - использовать "используя" заявление.
Это как неявная попытка-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