Impossibile chiudere OledbDataReader nel database Sybase in VB.NET
-
02-07-2019 - |
Domanda
Non riesco a chiudere l'oggetto OledbDataReader dopo aver letto i dati da esso. Ecco il codice pertinente -
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()
L'applicazione console si blocca nel punto in cui provo a chiudere il lettore. L'apertura e la chiusura di una connessione non è un problema, quindi qualcuno ha qualche idea di cosa potrebbe causare questo?
Soluzione
Ho trovato la risposta!
Prima
drSyBase.Close()
Devi chiamare il metodo di annullamento dell'oggetto Command
cmdSyBase.Cancel()
Credo che questo potrebbe essere specifico per i database Sybase
Altri suggerimenti
Questo è un colpo lungo, ma prova a spostare le tue linee .Close () e .Dispose () in un blocco di Infine del Try. In questo modo:
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
È da un po 'che non uso VB.NET, ma il modo più sicuro per gestirlo in C # è usare un " usando " comunicato.
È come un tentativo-catch implicito e si assicura che tutte le risorse siano chiuse / cancellate e smaltite quando il " usando " finisce.
using (OleDb.OleDbConnection connection = new OleDb.OleDbConnection(connectionString))
{
DoDataAccessStuff();
} // Your resource(s) are killed, disposed and all that
Aggiornamento : trovato un collegamento su Utilizzando l'istruzione in VB.NET 2.0 , spero che sia d'aiuto.
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