Login System mit einer Access Datenbank - Problem [Anfänger]

  • VB.NET

Es gibt 35 Antworten in diesem Thema. Der letzte Beitrag () ist von Gigar2453.

    Login System mit einer Access Datenbank - Problem [Anfänger]

    Hallo


    Und zwar habe ich ein Problem. Ich wollte zur Übung ein Login System in Visual Basic 2010 nachbauen und scheitere nun an der Übergabe des SQL Befehls bzw. am auslesen aus der Acces Datenbank. Per Click auf den Login Button will ich mein Benutzernamen & Passwort abfragen. Ich lasse mal mein Code hier.

    VB.NET-Quellcode

    1. Private Sub Loginbtt_Click(sender As System.Object, e As System.EventArgs) Handles Loginbtt.Click
    2. Dim con As New OleDbConnection 'con ist die Variable für den Connection String
    3. Dim benutzer As String = LoginName.Text 'benutzer ist die Variable für den Benutzernamen
    4. Dim passwort As String = Passworttxt.Text 'passwort ist die Variable für das Passwort
    5. Dim Abfrage As String
    6. '---CONNECTION ZUR DATENBANK-----------------------------------------------------------------------------------------------------
    7. con.ConnectionString =
    8. "Provider=Microsoft.ACE.OLEDB.12.0;" &
    9. "Data Source=C:\Users\timok\Desktop\Login_DB1.accdb;" ' Connection String zur Datenbank
    10. Try
    11. con.Open() ' Verbindung öffnen
    12. Catch ex As Exception
    13. MsgBox("Keine Verbindung zur Datenbank : " & ex.Message) ' Fehlermeldung falls keine Verbindung zur Datenbank besteht
    14. End Try
    15. '-------------------------------------------------------------------------------------------------------------------------------
    16. Dim myAdapter As New OleDbDataAdapter
    17. Abfrage = "SELECT * FROM logindaten WHERE Benutzername ='" + Replace(benutzer, " ", "") & "' AND Passwort ='" & Replace(passwort, " ", "") & "'" 'Abfrage ist die Variable für die SQL Abfrage"
    18. Dim Command As New OleDb.OleDbCommand
    19. Command.Connection = con
    20. Command.CommandText = Abfrage
    21. myAdapter.SelectCommand = Command
    22. Dim myData As OleDbDataReader
    23. myData = Command.ExecuteReader() 'Hier startet man die SQL Abfrage
    24. If myData.HasRows Then ' Wenn die Abfrage Einträge enthält / also der Benutzer und das Passwort stimmen überein
    25. MsgBox("Einloggen erfolgreich !")
    26. Else 'Sonst wird angezeigt das die Daten falsch sind
    27. MsgBox("Falsche Daten")
    28. End If
    29. con.Close()
    30. End Sub


    Das Problem entsteht in Zeile 29. Dort wo ich meinen Benutzernamen und Passwort auslesen möchte. Entschuldigt die unübersichtliche Programmierung und offensichtliche Fehler(lerne noch X/ )

    Ich hoffe jemand weiß was ich Falsch mache und kann mir dazu einen guten Tipp zum Weg der Lösung geben.

    Viele Dank!
    haltepunkt dahinter setzen, und mit Maus drüber fahren.
    besser: Haltepunkt dahinter setzen, und im LokalFenster nachgucken. Von dort kannste sogar mit Copy/Paste den Inhalt in einen ForenPost übernehmen.

    noch besser: Besorg dir was, dass du den Ton kriegst, is wichtig, denn erklärt dir das Werkzeug, mit dem du arbeitest.

    VB.NET-Quellcode

    1. Dim myAdapter As New OleDbDataAdapter
    2. Abfrage = "SELECT * FROM logindaten WHERE Benutzername ='" + Replace(benutzer, " ", "") & "' AND Passwort ='" & Replace(passwort, " ", "") & "'" 'Abfrage ist die Variable für die SQL Abfrage"
    3. Dim Command As New OleDb.OleDbCommand
    4. Command.Connection = con
    5. Command.CommandText = Abfrage
    6. myAdapter.SelectCommand = Command
    7. Dim myData As OleDbDataReader
    8. myData = Command.ExecuteReader(Abfrage) 'Hier startet man die SQL Abfrage
    9. If myData.HasRows Then ' Wenn die Abfrage Einträge enthält / also der Benutzer und das Passwort stimmen überein
    10. MsgBox("Einloggen erfolgreich !")
    11. Else 'Sonst wird angezeigt das die Daten falsch sind
    12. MsgBox("Falsche Daten")
    13. End If
    14. con.Close()


    myData ist anscheinend nicht gefüllt obwohl ich ihm doch die Anweisung übergebe. "myData - Nothing" Das könnte mein Problem verursachen. Hast du eine Idee was ich falsch gemacht habe? Entschuldige aber ich lerne momentan noch.
    bei einem Haltepunkt in zeile#11 kann myData nicht Nothing sein.

    und was ist in Abfrage drinne?

    (Tipp grundsätzlich: Es führt dich zur Lösung hin, wenn du auf meine Fragen eingehst. Es führt in (heillose) Verwirrung, wenn du immer weitere Fragen aufwirfst, ohne dass bereits offene Fragen geklärt sind. Ausserdem kränkt es mich, wenn ich ignoriert werde)
    Hier nochmal die 5 Regeln für sinnvolle Fragen:Name der Exception und MeldungsText angeben

    1. Code-Ausschnitt posten
    2. Fehlerzeile angeben
    3. Fehlverhalten angeben
    4. Erwünschtes Verhalten angeben

    1. Code ausschnitt s.o.
    2. Fehlerzeile
    'Ungültige Konvertierung von der Zeichenfolge SELECT * FROM logindaten WHERE B in Typ Integer.' in Zeile 10 bei Knopfdruck Login
    3. Fehlverhalten
    Füllt myData nicht mit Daten, nehme ich an das es das Problem ist
    4.
    SQL Statement übergeben und mit der AccesDB vergleichen lassen. Ergebnis durch MsgBox.

    Ich hoffe nun ist es zu deiner zufriedenheit.

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Data.OleDb
    3. Public Class Form1
    4. Private Sub Loginbtt_Click(sender As System.Object, e As System.EventArgs) Handles Loginbtt.Click
    5. Dim con As New OleDbConnection 'con ist die Variable für den Connection String
    6. Dim benutzer As String = LoginName.Text 'benutzer ist die Variable für den Benutzernamen
    7. Dim passwort As String = Passworttxt.Text 'passwort ist die Variable für das Passwort
    8. Dim Abfrage As String
    9. '---CONNECTION ZUR DATENBANK-----------------------------------------------------------------------------------------------------
    10. con.ConnectionString =
    11. "Provider=Microsoft.ACE.OLEDB.12.0;" &
    12. "Data Source=C:\Users\timok\Desktop\Login_DB1.accdb;" ' Connection String zur Datenbank
    13. Try
    14. con.Open() ' Verbindung öffnen
    15. Catch ex As Exception
    16. MsgBox("Keine Verbindung zur Datenbank : " & ex.Message) ' Fehlermeldung falls keine Verbindung zur Datenbank besteht
    17. End Try
    18. '-------------------------------------------------------------------------------------------------------------------------------
    19. Dim myAdapter As New OleDbDataAdapter
    20. Abfrage = "SELECT * FROM logindaten WHERE Benutzername ='" + Replace(benutzer, " ", "") & "' AND Passwort ='" & Replace(passwort, " ", "") & "'" 'Abfrage ist die Variable für die SQL Abfrage"
    21. Dim Command As New OleDb.OleDbCommand
    22. Command.Connection = con
    23. Command.CommandText = Abfrage
    24. myAdapter.SelectCommand = Command
    25. Dim myData As OleDbDataReader
    26. myData = Command.ExecuteReader(CType(Abfrage, CommandBehavior)) 'Hier startet man die SQL Abfrage
    27. If myData.HasRows Then ' Wenn die Abfrage Einträge enthält / also der Benutzer und das Passwort stimmen überein
    28. MsgBox("Einloggen erfolgreich !")
    29. Else 'Sonst wird angezeigt das die Daten falsch sind
    30. MsgBox("Falsche Daten")
    31. End If
    32. con.Close()
    33. End Sub
    34. End Class


    Steht auf ON

    Gigar2453 schrieb:

    VB.NET-Quellcode

    1. myData = Command.ExecuteReader(CType(Abfrage, CommandBehavior)) 'Hier startet man die SQL Abfrage
    ja gut - da kann man nichts machen. wenn du zwischenzeitlich den Code änderst.

    Also Option Strict sorgt ja für strenge typüberprüfung, und dabei tritt zutage, dass du der ExecuteReader() - Methode keinen String andrehen kannst.

    CType ist ja eine Typumwandlung - damit hebelst du die grad aktivierte strenge Typüberprüfung gleich wieder aus, und stellst also den Strict Off - Zustand für diese Zeile wieder her.

    Was natürlich nix nützt, denn der ExecuteReader() - Methode kann man keinen String andrehen, und einen String - jedenfalls diesen - kann man auch mit CType nicht in ein CommandBehavior umwandeln (was immer das überhaupt sein mag).

    Also wirklich gut wäre, du könntest dir die .ExecuteReader() - Überladungen im ObjectBrowser mal angucken - wie im Video vorgeführt.
    Es gibt nämlich mehrere ExecuteReader() - Überladungen, und eine davon erwartet einfach garkeinen Parameter 8|

    Was soll auch der Parameter?
    Warum versuchst du mit Gewalt der command.ExecuteReader()-Methode nochmal die Abfrage zu übergeben? Das Command kennt die Abfrage schon, es hat sie ja als CommandText zugewiesen bekommen.