Datenbankverbindung wird nicht geschlossen

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Datenbankverbindung wird nicht geschlossen

    Moinmoin,

    meine Anwendungen stellen über MSSQL, MySQL oder Oledb eine Verbindung zu einer Datenbank her.

    Die Connection wäre etwa so

    VB.NET-Quellcode

    1. Dim SqlConn As New SqlConnection(Connectstring)
    2. With SqlConn
    3. MsgBox(1)
    4. .Open()
    5. MsgBox(.State.ToString & "(" & .State & ")")
    6. .Close()
    7. .Dispose()
    8. MsgBox(.State.ToString & "(" & .State & ")")
    9. MsgBox(3)
    10. End With


    Wenn ich nach dem Close über Abfragen …
    MySQL:

    SQL-Abfrage

    1. SHOW FULL PROCESSLIST


    MSSQL:

    SQL-Abfrage

    1. select spid, status, loginame, hostname, blocked, db_name(dbid) as db, cmd from master..sysprocesses where db_name(dbid) like 'meinedb'


    in der Datenbank nachsehe, steht mein Computer nach wie vor als verbunden drin und blockiert so die Datenbank.
    Ich möchte mich zur Datenbank verbinden, aus einer Tabelle eine Version auslesen und ggf. die Verbindung trennen und die Datenbank durch eine neuere ersetzen. Dies funktioniert dann aber nicht, weil die Datenbank durch die getrennte SqlConnection weiterhin blockiert wird.
    Bei der Oledb Verbindung zu einer accdb bleibt die temporäre Datei laccdb auch offen, was mir zeigt dass auch hier die Verbindung nicht geschlossen ist.

    Ich habe es mit Connection.Close, Connection = Nothing versucht, ohne Änderung.
    Erst wenn ich meine Anwendung ganz schließe, wird die Verbindung zur Datenbank beendet, kann ja so nicht gewollt sein.

    Wenn ich mir den Connection.State ausgeben lasse, so steht dieser nach dem Schließen auf Closed

    Woran kann das liegen?

    Freundliche Grüße und ein schönes Wochenende :)

    BlueLagoonX schrieb:

    With SqlConn
    MsgBox(1)
    .Open()
    MsgBox(.State.ToString & "(" & .State & ")")
    .Close()
    .Dispose()
    MsgBox(.State.ToString & "(" & .State & ")")
    MsgBox(3)
    End With


    Wieso schreibst du das so?

    Kommt VB.NET damit nicht durcheinander?
    Ich würde vermuten, dass VB.NET hiermit:

    MsgBox(.State.ToString & "(" & .State & ")")
    .Close()
    .Dispose()


    versucht die MsgBox zu schließen. Schreib es doch einfach so:

    MsgBox(.State.ToString & "(" & .State & ")")
    SqlConn.Close()
    SqlConn.Dispose()


    oder mach das mit einem using, dann wird sie ganz sicher geschlossen

    BlueLagoonX schrieb:

    in der Datenbank nachsehe, steht mein Computer nach wie vor als verbunden drin und blockiert so die Datenbank.
    So ein Verhalten kenne ich garnet.
    Also dass eine Connection in irgendeiner Weise eine Datenbank blockieren kann - es sei denn eine Transaction ist offen geblieben.
    Soweit ich weiss ist ConnectionPooling immer eine gute Idee.
    Dabei kann schon sein, dass eine DB sich eine clientseitig inzwischen geschlossene Connection noch merkt - das ist aber eine der Pooling-Optimierungen, damit diese Connection bei der nächsten Anfrage schneller wieder geöffnet werden kann.

    Aber schlag mich nicht tot - von so DB-Innereien verstehe ich tatsächlich garnet so besonders viel.