open DataReader obwohl alle geschlossen sind

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.

    open DataReader obwohl alle geschlossen sind

    Guten Abend allerseits

    Mich beschäftigt folgendes Problem:
    Ich habe zwei Forms "login und Chat". In beiden Forms werden insgesamt 5 MySqlDataReader verwendet um Abfragen zu machen und es werden definitiv auch alle 5 Reader nach der Abfrage wieder geschlossen.
    Wenn ich das Programm starte gibt es folgende Unbehandelte Ausnahme:
    MySql.Data.MySqlClient.MySqlException: "There is already an open DataReader associated with this Connection which must be closed first."
    Wenn doch alle geschlossen sind warum die Meldung?
    Ich habe mit Haltepunkten gearbeitet und alle DataReadersind wieder geschlossen.
    Kann mir bitte jemand einen Tipp geben?

    Hier der Code in dem das Programm "Meckert"

    VB.NET-Quellcode

    1. Private Sub Tmchat_Tick() Handles Tmchat.Tick
    2. Dim cmdreadchat As New MySqlCommand("SELECT chat FROM `DWP`.`tb_chat`", con)
    3. Dim chatreader As MySqlDataReader
    4. chatreader = cmdreadchat.ExecuteReader
    5. While chatreader.Read()
    6. If Not chatreader(0).ToString = ChattingBoxBackup.Text Then
    7. ChattingBoxBackup.Text = chatreader(0).ToString
    8. End If
    9. End While
    10. chatreader.Close()
    11. End Sub


    Zeile 4 sagt das noch ein DataReader offen ist.

    Grüße und Danke
    Gebhard

    Typhoon schrieb:

    Wenn ich das Programm starte
    Da solltest Du mal ein paar Haltepunkte hinsetzen, wo die Reader geöffnet werden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich schätze, die Connection wird noch offen sein.

    Visual Basic-Quellcode

    1. Dim cmdreadchat As New MySqlCommand("SELECT chat FROM `DWP`.`tb_chat`", con)


    Die ` kannst du dir im SqlCommand sparen, solange du keine Felder abfragst.
    Zudem solltest du Using statt Dim für Aufrufe verwenden, welche Disposing unterstützen.

    VB.NET-Quellcode

    1. Using cmdreadchat As New MySqlCommand("SELECT chat FROM DWP.tb_chat", con)
    2. Using chatreader = cmdreadchat.ExecuteReader
    3. While chatreader.Read()
    4. If Not chatreader(0).ToString = ChattingBoxBackup.Text Then
    5. ChattingBoxBackup.Text = chatreader(0).ToString
    6. End If
    7. End While
    8. End Using
    9. End Using


    Nimm Using, wo immer es geht, dann brauchst du dich um .Close nicht kümmern, zudem macht es den Code übersichtlicher.
    Ich bin das ganz anders gewohnt. Selbst wenn con eine geöffnete Verbindung ist, er öffnet ja gar keine Verbindung in Zeile 4. Normalerweise würde ExecuteReader meckern, dass eben die Verbindung zuvor nicht geöffnet wurde.
    Aber das wäre schnell getestet. Einfach ein cmdreadchat.Connection.Close vor den Execute.

    Ich würde Commands auch immer eine eigene Connection mitgeben, also keine Klassenvariable con, sondern eher eine Klassenvariable cmdreadchat, denn man muss doch gerade bei einem Chat mehrmals abfragen, da muss man doch nicht extra jedes mal einen neuen Command erzeugen.
    Guten Morgen liebes Forum
    und Danke für eure Antworten.

    @ Haudruferzappeltnoch
    Einfach ein cmdreadchat.Connection.Close vor den Execute.

    Habe ich auch schon versucht. Dabei kommt folgenden Meldung: System.InvalidOperationException: "Connection must be valid and open."

    @ BlueLagoonX
    Hat leider nicht funktioniert. Beim Ausführen bleibt es in einer Dauerschleife hängen.

    @ RodFromGermany
    Es stehen alle DataReader auf "IsClosed = True"

    Gruß Gebhard

    Typhoon schrieb:

    Es stehen alle DataReader auf "IsClosed = True"
    Offensichtlich eben nicht.
    Kannst Du ein kleines Testprojekt mit minimalen Daten bauen, das Deinen Effekt reproduziert?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo Haudrauferzappeltnoch

    Sorry für die sehr späte Antwort aber ich musste mein Projekt kurz aus Eis legen (Beruflich).

    Hier die con Function

    VB.NET-Quellcode

    1. Module dbConnect
    2. Public con As New MySqlConnection
    3. Public Function ConnectDatabase() As Boolean
    4. LeseIni()
    5. Try
    6. 'Testen ob die Verbindung noch offen ist, wenn nein dann
    7. If con.State = ConnectionState.Closed Then
    8. 'VerbindungsString erstellen
    9. con.ConnectionString = "SERVER=" & druckereimanagerConnection.serverName & "; PORT=" & druckereimanagerConnection.serverPort & "; USER ID=" & druckereimanagerConnection.userName & "; PASSWORD=" & druckereimanagerConnection.userPassWd & "; CHARSET=" & druckereimanagerConnection.charset & ";"
    10. 'Verbindung öffnen
    11. con.Open()
    12. End If
    13. 'und wahr zurückgeben
    14. Return True
    15. 'Fehler abfangen
    16. Catch myerror As MySqlException
    17. 'fehler meldung und fehlercode schreiben
    18. MessageBox.Show("Es konnte keine Verbindung zur Datenbank hergestellt werden. Bitte prüfen Sie die Servereinstellungen im Reiter Extras, Einstellungen und starten anschließend die Anwendung neu" & vbCrLf & "Errorcode: " & myerror.Number, "MySQL Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
    19. 'und fehler zurück geben
    20. Return False
    21. End Try
    22. End Function


    Gruß Gebhard
    Und das ist alles was mit con passiert? Dann sollte es keine Fehler geben. Ich vermute die verwendest du noch wo anders.

    Berücksichtige nochmal den letzten Absatz aus Post 4.
    Z.B. so (Public con und ConnectDatabase rausgeschmissen):

    VB.NET-Quellcode

    1. Public cmdreadchat As New MySqlCommand("SELECT chat FROM `DWP`.`tb_chat`", GetOpenConnection)
    2. Private Function GetOpenConnection As MySqlConnection
    3. LeseIni()
    4. Dim connectionString = "SERVER=" & druckereimanagerConnection.serverName & "; PORT=" & druckereimanagerConnection.serverPort & "; USER ID=" & druckereimanagerConnection.userName & "; PASSWORD=" & druckereimanagerConnection.userPassWd & "; CHARSET=" & druckereimanagerConnection.charset & ";"
    5. Dim con as New MySqlConnection(connectionString)
    6. Try
    7. con.Open()
    8. Catch myerror As MySqlException
    9. 'fehler meldung und fehlercode schreiben
    10. MessageBox.Show("Es konnte keine Verbindung zur Datenbank hergestellt werden. Bitte prüfen Sie die Servereinstellungen im Reiter Extras, Einstellungen und starten anschließend die Anwendung neu" & vbCrLf & "Errorcode: " & myerror.Number, "MySQL Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
    11. End Try
    12. Return con
    13. End Function
    14. Private Sub Tmchat_Tick() Handles Tmchat.Tick
    15. Dim chatreader As MySqlDataReader
    16. chatreader = cmdreadchat.ExecuteReader
    17. While chatreader.Read()
    18. If Not chatreader(0).ToString = ChattingBoxBackup.Text Then
    19. ChattingBoxBackup.Text = chatreader(0).ToString
    20. End If
    21. End While
    22. chatreader.Close()
    23. End Sub
    (wobei man das Fehler-Handling nochmal überdenken kann, Programmneustart ist sicher nicht erforderlich, ein Aufruf cmdReadchat.Connection.Open reicht, wenn man das Verbindungsproblem denn behoben kriegt...).
    Das Öffnen verschiebe ich auch gern nach hinten, bei einem Chat ist es vorne aber wohl gut platziert.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()