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?

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top