Mit VB.net testen, ob Datensatz in DB vorhanden ist

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

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

    Mit VB.net testen, ob Datensatz in DB vorhanden ist

    Hallo zusammen,
    ich baue mit ASP.net und VB.net eine Webseite mit Useranmeldung. Alle Dateien und die DB liegen beim Hoster.

    Es hat alles mal funktioniert, bis ich auf die Idee kam, die Datenbankabfrage im VB-Code "sicherer" zu machen.
    Ich arbeite mit folgendem Code, der die Existenz eines Datensatzes überprüfen soll:

    VB.NET-Quellcode

    1. strQuery = "SELECT Vorname, Email FROM dbo.qwertz WHERE Vorname='" + vorname + "' AND Email='" + email + "'"
    2. Dim datensatz_not_exist As Boolean = True
    3. Using SqlConnect As New SqlConnection(ConfigurationManager.ConnectionStrings("DB_Datenbank").ConnectionString())
    4. ' Der ConnectionString liegt in der web.config
    5. Try
    6. SqlConnect.Open()
    7. Dim Command As New SqlCommand(strQuery, SqlConnect)
    8. If Command.ExecuteScalar() IsNot Nothing Then
    9. SqlConnect.Close()
    10. SqlConnect.Dispose()
    11. lblinfo.Text = "Unter dieser E-Mailadresse ist dieser Vorname schon registriert!"
    12. datensatz_not_exist = False
    13. txtpasswort1.Text = ""
    14. txtpasswort2.Text = ""
    15. passwort1 = ""
    16. passwort2 = ""
    17. Else 'vorname UND email noch nicht vorhanden
    18. SqlConnect.Close()
    19. SqlConnect.Dispose()
    20. End If
    21. Catch ex As Exception
    22. SqlConnect.Close()
    23. SqlConnect.Dispose()
    24. 'Response.Write(ex.Message)
    25. Exit Sub
    26. End Try
    27. End Using


    Bei allem Suchen und Querlesen bin ich mittlerweile völlig verwirrt und weiß wohl nicht mehr was ich da geschrieben habe?!
    Ich hatte zwar mal eine funktionierende Lösünung, aber die arbeitete ohne 'using'.

    Kann mir jemand sagen, wo ich hier etwas falsch gemacht habe?
    Schönen Gruß
    Trebron

    - Visual Studio Community 2017 -

    Trebron schrieb:

    etwas falsch gemacht habe?
    Zeile #10,11,19,20,23,24 sind überflüssig, das macht das Using selbst, dann noch den TryCatch-Zweig entfernen ...
    Und dann probier es nochmals und steppe deinen Code von Hand durch...

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

    Hi,
    villeicht probierst du es mal so.

    VB.NET-Quellcode

    1. Public connString As String = "" 'evtl. Global zugänglich machen ????
    2. Private Sub test()
    3. Dim AnzahlEinträge As Integer = 0
    4. Dim datensatz_not_exist As Boolean = True
    5. Dim sqlCommand = "SELECT COUNT(*) FROM dbo.qwertz WHERE Vorname ='" & vorname & "' AND Email ='" & email & "'"
    6. Using SqlConn As New MySql.Data.MySqlClient.MySqlConnection(connString)
    7. SqlConn.Open() 'Verbindung öffnen
    8. Using cmd As New MySql.Data.MySqlClient.MySqlCommand(sqlCommand, SqlConn)
    9. AnzahlEinträge = CInt(cmd.ExecuteScalar()) 'Befehl ausführen und Antwort als Integer in AnzahlEinträge
    10. End Using
    11. End Using
    12. If AnzahlEinträge > 0 Then
    13. 'mach was...
    14. datensatz_not_exist = True
    15. Else
    16. 'mach was anderes...
    17. datensatz_not_exist = False
    18. End If
    19. End Sub
    So, alles funktioniert!
    Ich habe die Änderungen, wie von "VB1963" vorgeschlagen, übernommen.
    Habe aber dennoch eine Frage:
    Wenn 'End Using' das Close und das Dispose ersetzt, warum übernimmt dann 'Using' nich das SqlConnect.Open() wie in Zeile 7?

    Vorerst Besten Dank!
    Schönen Gruß
    Trebron

    - Visual Studio Community 2017 -
    Das End Using ruft die Dispose-Methode des erstellten Objektes auf. Und da dürfte für Deine Connection u.a. Close schon drinstehen.
    Aber dass bei New gleich Open() aufgerufen wird, ist nicht zwangsläufig erwünscht. Daher musst Du das selber machen.
    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.