Prüfen ob connect funktion fehlerarray zurückgibt

  • VB.NET
  • .NET 5–6

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Typhoon.

    Prüfen ob connect funktion fehlerarray zurückgibt

    Hallo zusammen

    Was mache ich schon wieder falsch???

    Ich versuche zu prüfen ob eine Verbindung zu MySql-Server besteht. Es wird aber ein Fehler an folgender Programmzeile angzeigt.

    Hier ein kleiner Ausschnitt:

    VB.NET-Quellcode

    1. 'prüfen ob connect funktion fehlerarray zurückgibt
    2. Dim myConnectArray = ConnectDatabase()
    3. If IsArray(myConnectArray) Then
    4. 'wenn ja, dann fehlermeldung anzeigen
    5. MessageBox.Show(TM_ERROR_MESSAGE_CONNECTION_TO_SERVER_COULD_NOT_OPEN & vbCrLf & myConnectArray(0) & vbCrLf & "Errorcode: " & myConnectArray(1), TM_ERROR_TYPE_MYSQL_SERVER_CONNECTION, MessageBoxButtons.OK, MessageBoxIcon.Error)
    6. ElseIf myConnectArray = vbBoolean And myConnectArray = True Then
    7. 'wenn nein und rückgabe = wahr
    8. 'erfolg anzeigen
    9. If myDebug = True Then MessageBox.Show(TM_ERROR_MESSAGE_CONNECTION_OPEN, TM_ERROR_TYPE_MYSQL_SERVER_CONNECTION, MessageBoxButtons.OK, MessageBoxIcon.Information)
    10. 'connectState auf wahr setzen
    11. connectState = True
    12. Else
    13. 'wenn nein und rückgabe = falsch
    14. 'bereits bestehende Verbindung melden
    15. If myDebug = True Then MessageBox.Show(TM_ERROR_MESSAGE_CONNECTION_ALREADY_EXISTS, TM_ERROR_TYPE_MYSQL_SERVER_CONNECTION, MessageBoxButtons.OK, MessageBoxIcon.Information)
    16. 'connectState auf wahr setzen
    17. connectState = True
    18. End If


    Warum Zeichfolge True in Typ Double"?

    Gruß Gebhard
    Bilder
    • Bild1.jpg

      185,28 kB, 1.348×744, 68 mal angesehen
    Oh, vbBoolean ist ein echter Ausdruck, dachte erst das wäre nur eine Variable.
    Der meckert dann wegen falsche Typen.
    Ich kann deine Fehlermeldung aber nicht reproduzieren. Hast du Option Strict On oder Off? Vermutlich Off, denn mit On kriege ich da schon Meldungen vor dem Kompilieren.
    Wie sieht denn myConnectArray aus bzw. die ConnectDatabase Funktion?
    Oje tut mir leid! Option Strict war auf Off. War da wohl nicht genau mit der Maus ;)

    Jetzt ist myConnectArray rot unterstrichen und jeweils zwei Meldungen werden ausgegeben wenn ich mit der Mause auf die Zeile gehe. ( Bild 2 u. 3 )

    Function ConnectDatabase

    VB.NET-Quellcode

    1. 'importieren von MySql
    2. Imports MySql.Data.MySqlClient
    3. Module dbConnect
    4. 'die Verbindung zur Datenbank definieren, damit von überall her darauf zugegriffen werden kann
    5. Public con As New MySqlConnection
    6. Public Function ConnectDatabase() As String
    7. 'array defninieren
    8. Dim mysqlError As String
    9. LeseIni()
    10. Try
    11. 'Testen ob die Verbindung noch offen ist, wenn nein dann
    12. If con.State = ConnectionState.Closed Then
    13. 'VerbindungsString erstellen
    14. con.ConnectionString = "SERVER=" & druckereimanagerConnection.serverName & "; PORT=" & druckereimanagerConnection.serverPort & "; USER ID=" & druckereimanagerConnection.userName & "; PASSWORD=" & druckereimanagerConnection.userPassWd & "; CHARSET=" & druckereimanagerConnection.charset & ";"
    15. 'Verbindung öffnen
    16. con.Open()
    17. End If
    18. 'und wahr zurückgeben
    19. Return CStr(True)
    20. 'Fehler abfangen
    21. Catch myerror As MySqlException
    22. 'fehler meldung und fehlercode in array schreiben
    23. mysqlError = myerror.Message & " " & myerror.Number.ToString
    24. 'und fehler zurück geben
    25. Return mysqlError
    26. End Try
    27. End Function
    28. End Module
    Bilder
    • Bild3.jpg

      95,06 kB, 1.306×384, 55 mal angesehen
    • Bild2.jpg

      81,09 kB, 991×423, 50 mal angesehen
    Da stellen sich einem viele Fragen, aber ich versuche mich mal auf die Wesentlichen zu beschränken.

    Das Studio meckert das String und Boolean nicht der gleiche Typ ist.
    Ist das nachvollziehbar?

    Deine Funktion ConnectDatabase() gibt einen String zurück. Das hast du selbst so gewählt. Ich schätze, weil du unbedingt im Fehlerfall die Fehlernachricht sehen willst. Da die Funktion aber explizit auf Fehler testet, ist das redundant, du weißt doch was der Fehler ist, wenn der Fehler an dieser Stelle auftritt.

    Du solltest also einen anderen Rückgabewert wählen.
    Von welchem Typ sollte der also idealerweise sein?

    Typhoon schrieb:

    'fehler meldung und fehlercode in array schreiben
    Allein dieser Kommentar ist schon Schuss ins eigene Knie. An welcher Stelle wird hier was in ein Array geschrieben? Es gibt an dieser Stelle kein Array. Nur zur Klarstellung: Ein Array ist eine Ansammlung mehrerer Werte vom gleichen Datentyp, die gemeinsam alle in einer Variable gespeichert werden. Und sag mir jetzt bitte nicht, dass ein String ein Char-Array ist, das ist es nämlich nicht.

    ConnectDatabase ist vom Namen her eine Sub, keine Function. Eine Konvention (wie Microsoft immer mal wieder mit Ausnahmen selber bricht). Es ist ein Befehl (Imperativ) an den Compiler: »mach diesUndDas«. In dem Fall also: Stelle Verbindung zur Datenbank her. Dass da ein Wert zurückkommt, ja sogar ein Text (String) fände ich höchst unintuitiv. Dass das Teil notfalls eine Exception wirft, wäre grundsätzlich erwartbar.

    Sag mal bitte kurz, was CStr(True) ergibt, welche Bedeutung die Zeile ElseIf myConnectArray = vbBoolean And myConnectArray = True Then inhaltlich haben soll und wo in dieser Zeile ein Double mit einem String verglichen wird (also welcher Ausdruck vom Typ Double 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.

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

    Guten Morgen

    @Haudruferzappeltnoch

    Das Studio meckert das String und Boolean nicht der gleiche Typ ist.

    Ist das nachvollziehbar?


    String.... sind doch Buchstaben, Zahlen, Sonderzeichen etc.
    Boolean.... ist nur Wahr oder Falsch.

    String habe ich deshalb gewählt, weil con eben nur aus einem String besteht. (Habe ich einen Denkfehler?)
    Ich habe gerade versucht, anstatt String einenj Boolean zu benutzen. Es sind 3 weitere Fehler aufgetreten (siehe Anhang)

    @VaporiZed

    Sag mal bitte kurz, was CStr(True)
    (siehe Anhang)

    welche Bedeutung die Zeile ElseIf myConnectArray = vbBoolean And myConnectArray = True Then inhaltlich haben soll


    VB.NET-Quellcode

    1. 'wenn nein und rückgabe = wahr


    und wo in dieser Zeile ein Double mit einem String verglichen wird


    Eben ich bin verwirrt ?(
    Bilder
    • Bild6.jpg

      88,37 kB, 973×484, 52 mal angesehen
    • Bild5.jpg

      87,66 kB, 973×526, 45 mal angesehen
    • Bild4.jpg

      91,63 kB, 1.824×351, 53 mal angesehen
    Was jetzt CStr(True) für sich gesehen als Wert ergibt, hast Du nicht beantwortet. Leider hast Du auch nicht erklärt, was die vbBoolean-Zeile für Dich bedeuten soll und wo jetzt der vom Compiler angemeckerte Double-Wert steckt. So wirst Du es zukünftig weiterhin schwer haben, Fehler selbständig zu beheben.
    Zusammengefasst: Du vergleichst Äpfel mit Glühbirnen. Kein Wunder, dass der Compiler streikt. Und es bringt auch nix, da auf Boolean umzusteigen. Du musst den vorhandenen Code insofern umbauen, dass er datentyptechnisch konsistent ist.
    Der erste Schritt: Vereinheitlichung innerhalb von ConnectDatabase. Es gibt mehrere Wege.
    • Ich würd es ohne Rückgabewert machen und die Exception für sich sprechen lassen. Es sagt ja niemand, dass Du die in der ConnectDatabase auch per Catch abfangen musst. Das kannst Du ja auch in der aufrufenden Methode machen.
    • Du kannst einen String zurückgeben, ähnlich wie bisher. Aber dann musst Du auch in der aufrufenden Sub das so handhaben, dass Du den zurückgegebenen Ergebniswert als String behandelst und nicht mit anderen Datentypwerten vergleichst, wie Du es jetzt machst. Allein in der bereits erwänten ElseIf myConnectArray = vbBoolean And myConnectArray = True Then vergleichst Du Deinen Ergebnisstring mit zwei anderen Datentypen - daher die Compilerfehler. Prüfungsfrage: Mit welchen Werten vergleichst Du es und von welchem Datentyp sind diese beiden anderen Werte?
    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.
    @Typhoon
    Ich meinte, ob das Meckern nachvollziehbar ist. Denn das ist der wichtige Punkt hier.
    Gerade weil Boolean nur True oder False sein kann, kann der Compiler das nicht mit einem String vergleichen. (Selbst dann nicht, wenn der String die Buchstabenkombination "True" ergibt, im Computer werden diese Sachen unterschiedlich behandelt.)

    Ich tue mich schwer deinen Code zu berichtigen, denn ohne Veränderung der Funktionalität käme da trotz Funktionstüchtigkeit nur Murks raus.
    Soll myDebug anzeigen, ob du gerade debuggst? Warum brauchst du dann überhaupt handgeschnitzte Fehlermeldungen?
    Guten Abend

    Ich gebe auf. Ich sitze schon den ganzen Tag vor dem PC und versuche DIES DAS ANNANAS!!
    Bin halt kein Profi.

    @VaporiZed
    Was jetzt CStr(True) für sich gesehen als Wert ergibt, hast Du nicht beantwortet.

    Ich habe einen Haltepunkt an der Stelle gesetzt ElseIf myConnectArray = vbBoolean And ......... Hier ein Screenshot

    Ich habe es jetzt soweit hin gebracht, das wenn keine Verbindung zum MySQL-Server besteht wenigstens das Programm ausgeführt wird um in den Einstellungen die richtige IP einzugeben zu können.
    Ich bekomme dennoch eine Fehlermeldung aus der Zeile ElseIf myConnectArray = vbBoolean And myConnectArray = True Then, wenn keine Verbindung besteht. (siehe Bild) Ich komm nicht drauf.

    Danke trotzdem für eure Bemühung mir zu helfen.

    Gruß und Danke Gebhard
    Bilder
    • Bild8.jpg

      67,66 kB, 808×397, 47 mal angesehen
    • Bild7.jpg

      418,19 kB, 2.521×1.428, 52 mal angesehen
    Schade, dass Du es anscheinend nicht versuchst, meine Fragen zu beantworten. Daher weiß ich auch nicht, inwieweit Dir die folgenden Antworten überhaupt helfen werden.
    CStr(True) ergibt den Text "True"
    vbBoolean ist eine spezielle Form eines Double-Wertes. Ein Doublewert (eine Zahl) kann der Compiler nicht mit einem Text vergleichen, daher der Fehler in der Zeile mit ElseIf myConnectArray = vbBoolean. Denn ElseIf "True" = 16 ergibt keinen Sinn. Daher ergibt And myConnectArray = True auch keinen Sinn. Das eine ist ein Text, das andere ein Boolean. Grundsatzunterschiedliche Datentypen können nunmal nicht verglichen werden. Mit Option Strict Off werden die Textversionen dieser Werte verglichen. Aber das ergibt eben oft keinen Sinn. Daher der Hinweis von uns: Option Strict On.

    Was Sinn ergeben könnte, wäre: ElseIf myConnectArray = "True" Then - also ohne irgendeinen Vergleich mit vbBoolean. Und btw: Selbst die Frage nach der Bedeutung der ganzen Zeile hast Du mir nicht beantwortet, was - wie ich zumindest finde - keine freundliche Art der Kommunikation 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.
    Also du gehst aber auch wenig auf Denkanstöße ein.

    Ersetze doch mal den Code aus Post 1 durch

    VB.NET-Quellcode

    1. LeseIni()
    2. con.ConnectionString = "SERVER=" & druckereimanagerConnection.serverName & "; PORT=" & druckereimanagerConnection.serverPort & "; USER ID=" & druckereimanagerConnection.userName & "; PASSWORD=" & druckereimanagerConnection.userPassWd & "; CHARSET=" & druckereimanagerConnection.charset & ";"
    3. Try
    4. con.Open
    5. Catch
    6. End Try
    7. If con.State <> ConnectionState.Open Then MessageBox.Show("Verbindung konnte nicht geöffnet werden")
    Und dann sag was sich für Probleme darum entwickeln. Denn wie gesagt dein Code ist sehr redundant, und was davon wichtig ist wird nicht klar.
    Guten Morgen

    @VaporiZed

    keine freundliche Art der Kommunikation ist


    Es tut mit sehr leid, wenn ich dir keine genaue Antwort auf die Frage die du mir gestellt hast geben konnte. Ich war der Meinung, das du wissen wolltest, was CStr(True) als Wert ergibt und mit der Ausgabe des Screenshot`s als beantwortet gesehen. Es ist in demfall meine Fehler es nicht verstanden zu haben. Sorry.

    Ich möchte auch sicherlich keinen verwirren mit meinen Fragen die für Profis nicht nachvollziehbar sind.
    Das Projekt an dem ich dran bin ( Hobby ) ist zum großteil übernommen und nicht von mir selber geschrieben. Ich versuche zu lernen und verstehen was in dem Programm geschieht und wenn ich nicht weiter komme, bin ich sehr dankbar, hilfe aus diesem Forum zu bekommen.

    ElseIf myConnectArray = vbBoolean And myConnectArray = True Then


    Darauf kann ich nicht antworten, weil ich nicht genau weiss, was hier passiert.

    @Haudruferzappeltnoch

    Ich habe deinen Code verwendet und der Funkioniert. Wenn keine Verbindung zum Server besteht, wird der Fehler "Verbindung konnte nicht geöffnet werden" angezeigt. Nur jetzt bekomme ich eine neue Fehlermeldung. (siehe Bild)

    Ich probier trotzdem weiter.

    Danke euch

    Gruß Gebhard
    Bilder
    • Bild9.jpg

      276,62 kB, 1.468×837, 53 mal angesehen
    Dann öffne die Verbindung vorher. Ich dachte genau das machen wir hier seit drei Tagen.

    In den Fällen wo du angezeigt bekommst: "Verbindung konnte nicht geöffnet werden", musst du dafür sorgen, dass der Rest des Programms nicht weiterhin versucht auf diese Verbindung zuzugreifen.

    Oder passiert das auch wenn nicht die Meldung "Verbindung konnte nicht geöffnet werden" vorher kommt?
    Dann muss du dir mal die Eigenschaften der Connection anschauen in diesem Moment.
    Hallo zusammen

    Ich habs jetzt endlich geschafft.

    1. Funktion ConnectDatabase geändert.

    VB.NET-Quellcode

    1. 'importieren von MySql
    2. Imports MySql.Data.MySqlClient
    3. Module dbConnect
    4. 'die Verbindung zur Datenbank definieren, damit von überall her darauf zugegriffen werden kann
    5. Public con As New MySqlConnection
    6. Public Function ConnectDatabase() As Boolean
    7. LeseIni()
    8. Try
    9. 'Testen ob die Verbindung noch offen ist, wenn nein dann
    10. If con.State = ConnectionState.Closed Then
    11. 'VerbindungsString erstellen
    12. con.ConnectionString = "SERVER=" & druckereimanagerConnection.serverName & "; PORT=" & druckereimanagerConnection.serverPort & "; USER ID=" & druckereimanagerConnection.userName & "; PASSWORD=" & druckereimanagerConnection.userPassWd & "; CHARSET=" & druckereimanagerConnection.charset & ";"
    13. 'Verbindung öffnen
    14. con.Open()
    15. End If
    16. 'und wahr zurückgeben
    17. Return True
    18. 'Fehler abfangen
    19. Catch myerror As MySqlException
    20. 'fehler meldung und fehlercode schreiben
    21. MessageBox.Show("Es konnte keine Verbindung zur Datenbank hergestellt werden" & vbCrLf & "Errorcode: " & myerror.Number, "MySQL Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
    22. 'und fehler zurück geben
    23. Return False
    24. End Try
    25. End Function
    26. End Module


    2. Den Teil geändert der prüft ob die DB geöffnet ist oder nicht

    VB.NET-Quellcode

    1. Try
    2. 'prüfen ob Datenbank geöffnet ist True or False
    3. Dim myConnectArray = ConnectDatabase()
    4. If myConnectArray = True Then
    5. 'erfolg anzeigen
    6. If myDebug = True Then MessageBox.Show(TM_ERROR_MESSAGE_CONNECTION_OPEN, TM_ERROR_TYPE_MYSQL_SERVER_CONNECTION, MessageBoxButtons.OK, MessageBoxIcon.Information)
    7. 'connectState auf wahr setzen
    8. connectState = True
    9. Else
    10. 'bereits bestehende Verbindung melden
    11. If myDebug = True Then MessageBox.Show(TM_ERROR_MESSAGE_CONNECTION_ALREADY_EXISTS, TM_ERROR_TYPE_MYSQL_SERVER_CONNECTION, MessageBoxButtons.OK, MessageBoxIcon.Information)
    12. 'connectState auf unwahr setzen
    13. connectState = False
    14. End If


    Warum es zuerst so Programmiert wurde ist mir unklar.

    Danke nochmals für eure Denkanstöße und eure Geduld.

    Gruß Gebhard