Impossible de fermer OledbDataReader à la base de données Sybase dans VB.NET
-
02-07-2019 - |
Question
Je ne semble pas être en mesure de fermer l'objet OledbDataReader après en avoir lu les données. Voici le code pertinent -
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'application console se bloque juste au moment où j'essaie de fermer le lecteur. Ouvrir et fermer une connexion ne pose pas de problème. Quelqu'un at-il une idée de ce qui peut en être la cause?
La solution
J'ai trouvé la réponse!
Avant
drSyBase.Close()
Vous devez appeler la méthode cancel de l'objet Command
.cmdSyBase.Cancel()
Je pense que cela peut être spécifique aux bases de données Sybase
Autres conseils
Ceci est un long plan, mais essayez de déplacer vos lignes .Close () et .Dispose () dans un bloc Finally du Try. Comme ceci:
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
Cela fait longtemps que je n'utilise pas VB.NET, mais le moyen le plus sûr de gérer cela en C # consiste à utiliser un " utilisant ". déclaration.
Il s’agit d’une tentative d’attrape implicite qui garantit que toutes les ressources sont fermées / annulées et supprimées lors de la validation "en utilisant". se termine.
using (OleDb.OleDbConnection connection = new OleDb.OleDbConnection(connectionString))
{
DoDataAccessStuff();
} // Your resource(s) are killed, disposed and all that
Mise à jour : un lien sur L'utilisation de l'instruction dans VB.NET 2.0 , espérons que cela aidera.
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