The connection has been disposed

  • VB.NET
  • .NET 7–8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Steve4pvd.

    The connection has been disposed

    Guten Abend,
    Bin neu hier. Programmiere schon länger aber neu in VB net.

    Wir haben eine Auftragsverwaltung mit SQL Datenbank (SAGE), auf die ich ausschließlich Lesezugriff habe.
    Ich möchte offene Aufträge in eine andere Datenbank (XAMPP) kopieren, so dass die Bearbeiter Felder ändern und ergänzen können.

    Auslesen der offenen Aufträge in ein DataTable / DataGridView funktioniert.
    Die Werte in ein Array übertragen funktioniert.
    Beim Schreiben der Datensätze in die XAMPP wird ein Datensatz korrekt geschrieben, dann erscheint obige Fehlermeldung "The connection has been disposed".

    Hier die Routine für die beiden Zugriffe:

    VB.NET-Quellcode

    1. Imports MySql.Data.MySqlClient
    2. Public Class DualControl
    3. 'Steuert den gleichzeitigen Zugriff auf XAMPP MySQL und SAGE Server
    4. Public DualConnS As New MySqlConnection
    5. Public DualConnectionStringS As String = "server=127.0.0.1;Port=4136;database=mand3;uid=nurlesen;pwd=nurlesen%1"
    6. Public DualcmdS As New MySqlCommand
    7. Public DualDBDAs As New MySqlDataAdapter
    8. Public DualDBDTs As New DataTable
    9. Public DualConnX As New MySqlConnection
    10. Public DualConnectionStringX As String = "server=127.0.0.1;Port=3306;database=intranet;uid=root"
    11. Public DualcmdX As New MySqlCommand
    12. Public DualDBDAX As New MySqlDataAdapter
    13. Public DualDBDTX As New DataTable
    14. Public Sub DualExecQueryS(MYSQLQuery As String)
    15. DualConnS.ConnectionString = DualConnectionStringS
    16. DualcmdS.Connection = DualConnS
    17. Using DualConnS
    18. Try
    19. DualConnS.Open()
    20. DualcmdS.CommandText = MYSQLQuery
    21. DualDBDAs = New MySqlDataAdapter(DualcmdS)
    22. DualDBDTs = New DataTable()
    23. DualDBDAs.Fill(DualDBDTs)
    24. Catch ex As Exception
    25. MessageBox.Show(ex.Message)
    26. End Try
    27. DualConnS.Close()
    28. End Using
    29. End Sub
    30. Public Sub DualExecQueryX(MYSQLQuery As String)
    31. DualConnX.ConnectionString = DualConnectionStringX
    32. DualcmdX.Connection = DualConnX
    33. Using DualConnX
    34. Try
    35. DualConnX.Open()
    36. DualcmdX.CommandText = MYSQLQuery
    37. DualDBDAX = New MySqlDataAdapter(DualcmdX)
    38. DualDBDTX = New DataTable()
    39. DualDBDAX.Fill(DualDBDTX)
    40. Catch ex As Exception
    41. MessageBox.Show(ex.Message & " Why")
    42. End Try
    43. DualConnX.Close()
    44. End Using
    45. End Sub


    Und hier noch die Routine, die die SQL Befehle erstellt und übergibt:

    VB.NET-Quellcode

    1. Private Sub ImportExec_Click(sender As Object, e As EventArgs) Handles ImportExec.Click
    2. For n = 0 To OpenOrders - 1
    3. Dim OrdersExport As String = "insert into sg_auf_fschrift (sg_auf_fschrift_pk, Aufnr, aufbez, ltermin, fldc03, name)
    4. values ('" & ActPK(n) & "','" & ActAU(n) & "','" & ActBZ(n) & "','" & ActLT(n) & "','" & ActF3(n) & "','" & ActNM(n) & "')
    5. On duplicate key update ltermin = '" & ActLT(n) & "';"
    6. Dualx.DualExecQueryX(MYSQLQuery:=OrdersExport)
    7. Next
    8. End Sub


    Wenn ich das Form schließe und neu öffne, kann ich wieder einen Datensatz anfügen.
    Ansonsten wird die exception in Zeile 44 aufgerufen.

    Schön wäre, wenn der Befehl zum Schreiben von 0 bis OpenOrders-1 durchlaufen würde.


    Vielen Dank schon mal für eure Hilfe und viele Grüße

    Stefan Esser

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Steve4pvd“ ()

    Das Problem hängt mit Zeile 37 zusammen, wenn der erste "loop" (aus ImportExec_Click) durch ist, wird DualConnX durch das using weggeräumt und existiert nicht mehr, daher "The connection has been disposed".
    Ich würde auch vermeiden für jede Abfrage die Verbindung auf- und wieder zuzumachen, das erzeugt nur unnötigen Mehraufwand.

    PS: Und wenn überhaupt, sollte das DualConnX.Close() in den finally-Block von deinem TryCatch.
    Auch wenn der Beitrag schon etwas älter ist, aber lies ihn dir trotzdem mal durch: TryCatch ist ein heißes Eisen
    gugge mal das hier:

    VB.NET-Quellcode

    1. Private Sub ImportExec_Click(sender As Object, e As EventArgs) Handles ImportExec.Click
    2. Dualx.LetAdptStayOpen '' Diese beiden optional
    3. For n = 0 To OpenOrders - 1
    4. Dim OrdersExport As String = $"insert into sg_auf_fschrift (sg_auf_fschrift_pk, Aufnr, aufbez, ltermin, fldc03, name)
    5. values ('{ActPK(n)}','{ActAU(n)}','{ActBZ(n)}','{ActLT(n)}','{ActF3(n)}','{ActNM(n)}') On duplicate key update ltermin = '{ActLT(n)}';"
    6. Dualx.DualExecQueryX(MYSQLQuery:=OrdersExport)
    7. Next
    8. Dualx.ThereforeCloseAdptYourself ''Diese beiden optional
    9. End Sub

    VB.NET-Quellcode

    1. Public Class DualControl
    2. 'Steuert den gleichzeitigen Zugriff auf XAMPP MySQL und SAGE Server
    3. Public DualConnectionStringS As String = "abc"
    4. Public DualConnectionStringX As String = "def"
    5. Public DualDBDAs As MySqlDataAdapter
    6. Public DualDBDAX As MySqlDataAdapter
    7. Public DualDBDTX As New DataTable
    8. Public DualDBDTs As New DataTable
    9. Public Sub New() 'DataAdapter händeln ihre Connection erstmal voll automatisch
    10. DualDBDAs = New MySqlDataAdapter(String.Empty, DualConnectionStringS)
    11. DualDBDAX = New MySqlDataAdapter(String.Empty, DualConnectionStringX)
    12. End Sub
    13. Public Sub DualExecQueryS(MYSQLQuery As String)
    14. DualDBDAs.SelectCommand.CommandText = MYSQLQuery
    15. DualDBDTs.Clear
    16. DualDBDAs.Fill(DualDBDTs)
    17. End Sub
    18. Public Sub DualExecQueryX(MYSQLQuery As String)
    19. DualDBDAX.SelectCommand.CommandText = MYSQLQuery
    20. DualDBDTX.Clear
    21. DualDBDAX.Fill(DualDBDTX)
    22. End Sub
    23. Public Sub LetAdptStayOpen() ' Falls man dem Adpt doch mal helfen muss
    24. DualDBDAs.SelectCommand.Connection.Open
    25. DualDBDAX.SelectCommand.Connection.Open
    26. End Sub
    27. Public Sub ThereforeCloseAdptYourself() ' Falls man dem Adpt doch mal helfen muss
    28. DualDBDAs.SelectCommand.Connection.Close
    29. DualDBDAX.SelectCommand.Connection.Close
    30. End Sub
    31. End Class

    In einer Schleife bietet es sich an die AdptConnection selbst zu steuern, weil der Adapter nich wissen kann, dass er vielmal hintereinander läuft.
    Möglicherweise kann man die Schleife ersetzen wenn man mit Update Befehlen arbeitet. Dein "Fill" schreibt ja scheinbar Daten, hab ich auch noch nicht gesehen.
    Dann implementierst noch IDisposable in DualControl

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