Ergebnis aus reader.read wird nicht sauber erkannt

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von EaranMaleasi.

    Ergebnis aus reader.read wird nicht sauber erkannt

    Guten Morgen zusammen,

    ich versuche gerade, in einer VB.NET Anwendung eine SQL Abfrage Richtung Access zu steuern.

    Aus der Accessdatei will ich auslesen, ob der User berechtigt ist, die Anwendung zu nutzen oder nicht:

    VB.NET-Quellcode

    1. 'Aufbau der Datenbankverbindung zum Auslesen der UserDaten
    2. Dim con As New OleDb.OleDbConnection
    3. Dim cmd As New OleDb.OleDbCommand
    4. Dim reader As OleDb.OleDbDataReader
    5. 'Es wird ein ConnectionString zur AccesDatenbank aufgebaut.
    6. con.ConnectionString =
    7. "Provider=Microsoft.ACE.OLEDB.12.0;" &
    8. "Data Source=C:\Users\xxxxxxxxx.accdb;" &
    9. "Jet OLEDB:Database Password = xxxxxxxxx;"
    10. cmd.Connection = con
    11. cmd.CommandText = "select 1 from BENUTZER where WINDOWSUSER = '" & TextBox1.Text & "'"
    12. Try
    13. con.Open()
    14. reader = cmd.ExecuteReader()
    15. Debug.Print("reader.Read() Beginn: " & reader.Read().ToString)
    16. If reader.Read() = True Then
    17. MessageBox.Show("klappt")
    18. Else
    19. MessageBox.Show("klappt nicht")
    20. End If
    21. Debug.Print("reader.Read() Ende: " & reader.Read().ToString)
    22. reader.Close()
    23. con.Close()
    24. Catch ex As Exception
    25. 'Wenn eine falsche, bzw. leere Eingabe gemacht wurde, erfolgt eine Fehlermeldung.
    26. MessageBox.Show(text:=ex.Message,
    27. icon:=MessageBoxIcon.Error,
    28. buttons:=MessageBoxButtons.OK,
    29. caption:="Berechtigungsprüfung konnte nicht durchgeführt werden.")
    30. End Try


    Wenn ich mit einem User anfrage, der nicht in der Access steht, erhalte ich im reader.read() ein "False" zurück.

    Durch die integrierte If möchte ich entscheiden, was dann passiert.
    Allerdings läuft er mir sowohl bei "True" als auch bei "False" in den Else-Teil rein.

    Ich habe es auch schon mit ungleich versucht oder If not.
    Hat auch nicht geholfen.

    Sowohl bei einem berechtigen als auch bei einem unberechtigten User ist es immer das selbe Ergebnis?!

    Hat jemand eine Idee, woran es liegen könnte?

    Vielen Dank im Voraus für eure Rückmeldung.
    Das Problem ist, dass Reader.Read() nicht das tut, was du denkst dass es tut.

    Reader.Read() gibt dir True zurück, wenn es noch weitere ungelesene Zeilen gibt. True oder False sind komplett unabhängig davon, was in diesen Zeilen steht.

    Dies bedeutet, du führst deinen Command aus, und bekommst eine Zeile zurück.
    Der erste aufruf von .Read() im Debug.Print() gibt dir natürlich True zurück, es ist ja auch noch eine lesbare Zeile vorhanden.
    Der nächste Aufruf von .Read() im IF (und auch alle weiteren Aufrufe) gibt dir nun ein False zurück, da es keine weiteren Zeilen mehr gibt.

    Reader.Read() ist eigentlich dafür gedacht, um z.B. mit einer While-Schleife, durch ein ErgebnisSet, also mehrere Zeilen zu iterieren, und dann die Werte mithilfe von Reader.GetXYZ() bzw. über den Indexer abzurufen.
    Hallo EaranMaleasi,

    vielen Dank für deine schnelle Rückmeldung.

    Dann hab ich da falsch gedacht :D
    Vielen Dank für die Erklärung.

    Wie bekomme ich da dann denn trotzdem eine sinnvolle Lösung hin?
    Also wie bekomme ich aus der Accesdatei herausgelesen, ob der anfragende Anwender berechtigt ist die Anwendung zu nutzen?
    Hast du mir da vielleicht eine Lösungshilfe?

    Vielen Dank im Voraus.
    Hallo,

    ich würde das wie folgt lösen. Sicher nicht 100% elegant aber es klappt.

    Im load - event Deiner Form kannst Du ja eine Datenbankabfrage mit dem Windowsuser abschicken und Dir den Returnwert in MY.Settings speichern. Dann kannst einfach eine if Abfrage machen und schauen ob ein Return Wert vorhanden ist, wenn ja dann gehts weiter wenn nein Anwendung beenden.

    Grüße
    Wieso den Weg über die Settings? Man kann doch das Ergebnis direkt in ne Variable Lesen, und dann die Anwendung beenden.

    @EveretEichhörnchen: Geht es hier jetzt speziell darum Windows User den Zugriff zu verweigern/gewähren? Oder hat deine Anwendung eine eigene Userverwaltung.
    Wie sieht es mit Passwörtern aus?

    Ich habe gerade mal deinen SQL-Befehl in MySQL getestet (Ich mag SQL nicht :whistling: ), und so wie es aussieht, kann man damit tatsächlich abfragen, ob Einträge mit der Bedingung existieren.
    Was du nun machen kannst, ist Reader.HasRows abzufragen, was praktischerweise ein Boolean ist, dann brauchst du auch keine Schleife.
    passt, mit reader.HasRows ist es ja elegant gelöst. Danke

    VB.NET-Quellcode

    1. Public User As String = Environment.UserName
    2. Public accessconnection As String = "Provider=Microsoft.ACE.OLEDB.12.0;" &
    3. "Data Source=Pfad der DB;" &
    4. "Jet OLEDB:Database Password = XXXXXXXX;"
    5. Private Sub Load(sender As Object, e As EventArgs) Handles MyBase.Load
    6. benutzerpruefung()
    7. End Sub
    8. Sub benutzerpruefung()
    9. Dim Abfrage As String = "select * from *** where windowsuser = '" & User.ToString & "'"
    10. Using connection As OleDb.OleDbConnection = New OleDb.OleDbConnection(accessconnection)
    11. Dim command As OleDb.OleDbCommand = connection.CreateCommand()
    12. command.CommandText = Abfrage
    13. Try
    14. connection.Open()
    15. Dim reader As OleDb.OleDbDataReader = command.ExecuteReader()
    16. If reader.HasRows = True Then
    17. Anwendung.Show()
    18. Anwendung.PictureBox1.Visible = True
    19. Else
    20. Application.Exit()
    21. End If
    22. reader.Close()
    23. Catch ex As Exception
    24. Console.WriteLine(ex.Message)
    25. End Try
    26. connection.Close()
    27. End Using
    28. End Sub

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

    EaranMaleasi schrieb:

    Wieso den Weg über die Settings? Man kann doch das Ergebnis direkt in ne Variable Lesen, und dann die Anwendung beenden.


    Ich wollte die Daten intern weiterverwenden.
    Aber ja, stimmt, im Prinzip geht auch eine Publicvariable X/

    EaranMaleasi schrieb:


    @EveretEichhörnchen: Geht es hier jetzt speziell darum Windows User den Zugriff zu verweigern/gewähren? Oder hat deine Anwendung eine eigene Userverwaltung.
    Wie sieht es mit Passwörtern aus?

    Ich hab bereits vorgeschalten eine Windowsseitige Benutzerverwaltung und muss in meiner Anwendung nur noch prüfen, ob eine Teilmenge aller User auf die Anwendung darf oder nicht.
    Daher ist das Passwortthema in dem Fall eher zu vernachlässigen.

    EaranMaleasi schrieb:


    Ich habe gerade mal deinen SQL-Befehl in MySQL getestet (Ich mag SQL nicht :whistling: ), und so wie es aussieht, kann man damit tatsächlich abfragen, ob Einträge mit der Bedingung existieren.
    Was du nun machen kannst, ist Reader.HasRows abzufragen, was praktischerweise ein Boolean ist, dann brauchst du auch keine Schleife.

    Erstmal abfragen, ob überhaupt was enthalten ist im Reader wäre auch mal sinnvoll gewesen zu testen :D
    Danke für den Hinweis.


    @Dome_2001: Vielen Dank für den Code! Das funktioniert :)

    Danke an euch beide für die schnelle und pragmatische Hilfe! :)

    EveretEichhörnchen schrieb:

    Aber ja, stimmt, im Prinzip geht auch eine Publicvariable
    Wenn Public, dann bitte Property. Aber selbst das meinte ich nicht. Du kannst die Prüfung ja auch in eine eigene Methode auslagern, und dann irgendwo am Anfang deiner Anwendung eben diese Funktion aufrufen, und wenn False zurück kommt die Anwendung eben direkt wieder beenden. Da brauch es keine Settings, keine unschönen public Variablen (Felder) oder Properties.