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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top