iSeries Connection, Programm beenden, mscorlib, Das SafeHandle wurde geschlossen

  • VB.NET
  • .NET (FX) 1.0–2.0

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

    iSeries Connection, Programm beenden, mscorlib, Das SafeHandle wurde geschlossen

    Hallo zusammen,

    in meiner Application stelle ich eine Verbinding zu einer iSeries her und schließe diese dann wieder Ordnungsgemäß.

    Beim beenden der Application bekomme ich immer den Fehler: Das SafeHandle wurde geschlossen.


    VB.NET-Quellcode

    1. Dim cn As New iDB2Connection
    2. Dim CnnStr As String
    3. Dim cmd As New iDB2Command
    4. 'Verbindungs-String
    5. CnnStr = "DataSource=" & Trim(StdAS400) & ";UserId=" & Trim(User) & ";Password=" & Trim(Pass) & ";Naming=System;LibraryList=...., *USRLIBL"
    6. cn.ConnectionString = CnnStr
    7. 'Versuch des Verbindungsaufbaus
    8. cn.Open()
    9. cmd.Dispose()
    10. cn.Dispose()
    11. cn.Close()


    Kennt jemand eine möglichkeit über .net das Problem zu beheben?

    Vielen Dank und liebe Grüße
    Vanne
    evlt hilft dir das hier weiter

    bzw hab gesehen dass du eine instanz von iDB2Connection verwendest, wollt dich fragen, woher hast du die lib dafür? hab iDB2Connection gegoogelt und bin dann auf den mehrere einträge gestoßen unter anderem einen von ibm, da bin ich dann aber nicht mehr weiter gekommen, hab da keine link zum besagten "IBM i Access for Windows .Net Proivider" gefunden
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    VanneHaut schrieb:

    cn.Dispose()
    cn.Close()

    Du löschst das Objekt um es anschließend zu schließen. Aber wie willst du eine Aktion auf etwas ausführen, das nicht mehr vorhanden ist?
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Erstmal vielen Dank für eure Hilfe.

    Über die Installation von IBM iSeries Access für Windows.

    Leider bekomme ich die Fehlermeldung auch wenn ich erst einen cn.close und dann einen cn.dispose ausführe.

    Gibt es eine Möglichkeit bei me.close alle "Fehler" (in diesem Fall das Safehandle) zu unterdrücken?

    Oder hat jemand eine andere Idee?

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

    gibt es schon => alles in einem try catch block zu schreiben und dann halt im cath teil zu sagen logfile.write(oder so, bzw debug.print(ex.message))

    ABER: @ErfinderDesRades hat schon einen beitrag zu try-catch geschrieben und dass das nicht die beste lösung ist

    wenn du das programmm nur für dich brauchst, und nicht als firmensoftware verwendest, dann kannste try catch machen, solltes du das aber für irgendwelche wichtigen sachen brauchen(meinetwegen via dem programm hast du zugriff auf euren großrechner für deinen ganzen tools oder whatever, dann würd ich weiter suchen)

    bzw hast du mal nachgeschaut ob die connection überhaupt IDisposable implementiert? wenn ja kannste ma mit using block versuchen, dann einfach

    VB.NET-Quellcode

    1. Using con as new iDB2Connection
    2. [...]
    3. con.close()
    4. End Using


    evlt mag er das dispose nicht

    Edit: Also ich hab das jetzt auch mit der IBM.Data.DB2.iSeries.dll versucht und hab festgestellt, dass wenn ich den connectionstring mit dem mitgelieferten iConnectionStringBuilder erstelle(also den Properties die werte zuweise) oder gleich beim instanzieren der connection mitgebe, ich dann die verbindung mit der boolschen property CheckConnectionOnOpen teste ob die verbindung da ist, kam immer false raus

    hab mir dann den connectionString des connectionstringbuilders und den der connection selber ausgeben lassen und seltsamerweise wird da das passwort nicht mit ausgegeben.
    dachte mir naja evtl falsch eingebaut, hab das dann mit der string property password der verbindung und der string property des verbindungsstring builders gemacht => selbes ergebnis

    meine theorie: die von IBM haben schlicht und einfach vergessen in den connectionstring das passwort mit einzubauen

    Radinator

    Edit2: Bei mir kam der fehler nicht, ich hab die verbindung mit dem stringbuilder.connectionstring und mit dem connectionstring der connection aufgemacht, bei beiden kam keine fehlermeldung(sowohl mit dim xxx as xxx und am ende con.close und con.dispose, als auch mit using block
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

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

    Nochmals vielen Dank für die ausführliche Antwort. Jedoch bekomme ich diesen Fehler nicht beim erstellen oder schließen der Connection. Der Fehler erscheint beim schließen der Form. Ich mache me.close und dann kommt der Fehler. Auch dort habe ich ein Try Catch eingebaut, jedoch erscheint die Meldung trotzdem.

    Liebe Grüße