Unfähig OleDbDataReader zu Sybase-Datenbank in VB.NET zu schließen
-
02-07-2019 - |
Frage
Ich scheine nicht das OleDbDataReader Objekt zu nahe an der Lage sein, nach Daten von ihm zu lesen. Hier ist der relevante Code -
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()
Die Konsolenanwendung hängt gerade an dem Punkt, an dem ich versuche, den Leser zu schließen. Öffnen und Abbau eine Verbindung ist kein Problem, also jemand eine Idee für sich, was diese verursachen kann?
Lösung
Ich fand die Antwort!
Vor
drSyBase.Close()
Sie müssen die Methode des Objekts Befehl abbrechen rufen
cmdSyBase.Cancel()
Ich glaube, dass dies zu Sybase-Datenbanken spezifisch sein kann
Andere Tipps
Dies ist ein langfris Schuss, aber versuchen Sie Ihre .Close () und .Dispose () Linien in einem Schließlich Block des Try bewegen. Wie folgt aus:
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
Es ist schon eine Weile her, seit ich VB.NET verwendet, aber der sicherste Weg, dies in C # zu behandeln ist die Verwendung eines „ mit “ Anweisung.
Es ist wie ein impliziter try-catch und es stellt sicher, dass alle Ressourcen geschlossen / aufgehoben und angeordnet, wenn die Ende „mit“.
using (OleDb.OleDbConnection connection = new OleDb.OleDbConnection(connectionString))
{
DoDataAccessStuff();
} // Your resource(s) are killed, disposed and all that
Aktualisieren : Gefunden ein Link über Using-Anweisung in VB.NET 2.0 , hoffe, es hilft.
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