Was ist/bedeutet SqlConnection.Open

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    Was ist/bedeutet SqlConnection.Open

    Hallo,

    ich frage mich was so eine offene Verbindung eigentlich ist. Was passiert wenn ich mehrfach SqlConnection.Open() ausführe? Habe ich dann mehrere offene Verbindungen?
    Falls ja, schließt SqlConnection.Close() alle oder nur eine?
    Wenn ich SqlConnection neu zuweise, verschwindet/n dann die/alle offene/n Verbindung/en oder gar keine?

    Viele Grüße

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Es wäre schneller es einfach zu probieren.
    Aber Spekulatius: die Zuweisung geht, die alte Connection bleibt offen, aber kann nicht mehr geschlossen werden, weil sie nicht mehr über eine Variable ansprechbar ist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Es wäre schneller es einfach zu probieren.

    Das kann man gar nicht genug hervorheben (nicht nur für diesen Thread). Einfach mal selber aktiv werden und testen. Das macht das Lernen interessanter.
    FTFY:

    VaporiZed schrieb:

    Aber Spekulatius: die Zuweisung geht, die alte Connection bleibt offen, aber kann nicht mehr geschlossen werden, weil sie nicht mehr über eine Variable ansprechbar ist.

    Deshalb ist es gut, in so einem Fall mit Using zu arbeiten.

    VB.NET-Quellcode

    1. Using Connection As New SqlConnection
    2. Connection.Open ...
    3. End Using
    Aber das ist ja genau das Problem, das probiere ich aus, heißt so stehts im Programm. Aber das liefert mir doch nicht die Antwort, die ihr mir geben konntet/könnt. Ich stelle meist immer ein paar zusätzlich kleine Fragen, wodurch manchmal die größeren übersehen werden, vielleicht versuche ich es mal anders.

    Wird bei Using die Connection automatisch geschlossen? Sonst hätte ich das im Normalfall auch so benutzt:

    VB.NET-Quellcode

    1. Using Connection As New SqlConnection
    2. Connection.Open
    3. ...
    4. Connection.Close
    5. End Using


    @VaporiZed Genau darauf will ich hinaus: Was ist denn so eine offene Verbindung, wenn die da irgendwo rumschwebt? Kann die Probleme machen?

    Haudruferzappeltnoch schrieb:

    Was ist denn so eine offene Verbindung, wenn die da irgendwo rumschwebt? Kann die Probleme machen?
    Ja, kann sie.
    Alles, was disposable ist, kann vom GarbageCollector nicht korrekt aufgeräumt werden, und muss daher via .Dispose (alias End Using) aufgeräumt werden.
    Das ist der Zweck des IDisposable-Interfaces.
    Welcher Art die Probleme sind, ist meist im Einzelnen nicth bekannt - ist auch ganz verschieden.
    Ein unaufgeräumter FileStream macht andere Probleme als eine unaufgeräumte DbConnection.
    Letztere wird wohl irgendwie einen KommunikationsKanal zum SqlServer-Dienst verwalten.
    Dassis doch höchst plausibel, dass das nicht gut geht, wenn nicht aufgeräumt.
    Da würden ja bei mw. 100 Db-Zugriffen dann 100 so Kanäle herumfahren im Speicher

    Haudruferzappeltnoch schrieb:

    Wird End Using dann nicht mehr ausgeführt?

    Using schrieb:

    Die Using-Anweisung stellt sicher, dass Dispose auch dann aufgerufen wird, wenn innerhalb des Using-Blocks eine Ausnahme auftritt.

    Siehe dazu Genaueres hier...

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

    ich muss da einmal einhacken, weil ich das bis jetzt nicht rausfand.

    was passiert denn, wenn man einen TableAdapter (auch in Verbindung mit einen Manager) verwendet? Also bspw.

    Quellcode

    1. TableAdapter.Fill(irgendwas).


    Wann werden denn hier die Ressourcen freigegeben?
    Ich habe bis jetzt immer zu gegebenem Anlass ein .Dispose eingefügt. Ein Using wäre ja - nach meinen Verständnis nicht nötig, oder?

    Haudruferzappeltnoch schrieb:

    Kann ich das dann im Catch mit Connection.Close vorbeugen?


    Try-Catch hat auch eine "Finally"-Direktive, die immer am Ende des Catch-Blockes aufgerufen wird, egal ob eine Ausnahme aufgetreten ist oder nicht.
    Darin könntest Du Deine Connection.Close Anweisung auch unterbringen. Aber wie bereits erwähnt wurde, ist das in einer Using-Anweisung normal nicht erforderlich (auch wenns mit sauberer ist).


    @rrobbyy:
    Das kannst Du doch genauso in einer USING-Anweisung verpacken und dir das disposen sparen.

    VB.NET-Quellcode

    1. Using conn As New MySqlConnection With {.ConnectionString = ConnStr}
    2. Using adapter As New MySqlDataAdapter
    3. Using cmd As New MySqlCommand With {.Connection = conn}
    4. cmd.CommandText = "SELECT * FROM irgendwo;"
    5. adapter.SelectCommand = cmd
    6. adapter.Fill(dsRet)
    7. End Using
    8. End Using
    9. End Using


    Edit: Hier muss man nicht einmal eine Conn.Open Anweisung hinzufügen, da Adapter.Fill die Verbindung selbst öffnet.

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

    rrobbyy schrieb:

    was passiert denn, wenn man einen TableAdapter (auch in Verbindung mit einen Manager) verwendet?
    Da muss man im allgemeinen nix tun.
    So ein TableAdapter wird ja wiederverwendet - da entstehen keine hunderte von unaufgeräumten Resourcen.
    Und Wenn du ihn aus der Toolbox aufs Form ziehst, dann generiert der FormDesigner den Code so, dass auch diese eine Resource aufgeräumt wird, wenn das Form schliesst.

    Also wo mein Vorredner alles neu erstellt und wieder aufräumt, erstelle ich auf Klassenebene nur einmal und benötige zum Fill nur die Zeile

    VB.NET-Quellcode

    1. Me.TableAdapter.Fill(irgendwas)

    Ui wie kann man denn einen Rückgabewert disposen?
    Der muss ja bis zum Return vorhanden sein, und nach dem Return gehts nicht mehr.

    Oder vernichtet der Dispose hier beide?

    VB.NET-Quellcode

    1. Private Sub bla
    2. Dim Conn as SqlConnection
    3. Conn = test()
    4. Conn.Dispose
    5. End Sub
    6. Private Function test() as SqlConnection
    7. Dim cn as New SqlConnection("bla")
    8. return cn
    9. End Function

    Wieso denn beide? Es gibt nur eine. Die wird in Zeile#8 erstellt, in Z#9 an die aufrufende Methode weitergereicht, in Z#3 in Conn reingesteckt und in Z#4 plattgemacht. Fertig. Es gibt keine zweite.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ah das wusste ich noch garnicht, das sich das so mit Rückgabewerten verhält, danke

    Ist ein Parameter, den ich ByRef an eine Sub übergebe dasgleiche Konzept und eigentlich nur eine Variable? Oder sind das zwei, die sich gegenseitig immer abgleichen?

    VB.NET-Quellcode

    1. Private test as New SqlConnection("test)"
    2. Private Sub abc(ByRef testsub)
    3. testsub.Dispose
    4. End Sub

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

    Das hängt nicht damit zusammen das da was zurückbegeben wurde, sondern damit ob die Variable ein Referentyp oder ein Wertetyp ist.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen