Login Form

  • VB.NET

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von guccini.

    Hallo zusammen , habe problem nach umstellung "Option Strict On" in zeile 20,weiss nicht wie ich das beseitigen kann.


    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim connString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Temp\userDB.accdb"
    3. Dim myConnection As OleDbConnection = New OleDbConnection
    4. Dim da As OleDbDataAdapter
    5. Dim strSQL As String
    6. Dim ds As DataSet
    7. Dim firstName As String
    8. strSQL = "SELECT tblUsers.FirstName FROM tblUsers "
    9. strSQL = strSQL & "WHERE (tblUsers.userName = '" & (Me.TextBox1.Text) & "' "
    10. strSQL = strSQL & "And tblUsers.userPassword = '" & (Me.TextBox2.Text) & "');"
    11. myConnection.ConnectionString = connString
    12. da = New OleDbDataAdapter(strSQL, myConnection)
    13. ds = New DataSet
    14. da.Fill(ds, "users")
    15. myConnection.Close()
    16. For Each rowTest In ds.Tables(0).Rows
    17. firstName = rowTest("FirstName").ToString
    18. Next
    19. If firstName <> "" Then
    20. MessageBox.Show("Hallo " & TextBox1.Text & " Sie sind Eingelogt")
    21. Else
    22. MessageBox.Show("Benutzername,Passwort ist Falsch oder Sie sind nicht Registriert!")
    23. End If
    24. End Sub
    1. Name der Exception und MeldungsText angeben
    2. Code-Ausschnitt posten
    3. Fehlerzeile angeben
    4. Fehlverhalten angeben
    5. Erwünschtes Verhalten angeben

    1. "Option Strict On" lässt spätes Binden nicht zu.
    2. im ersten post vorhanden
    3. im ersten post zeile 20(rowTest)
    4. startet nicht (wird fehlermeldung angezeigt 1.)
    5. vorher hat funktioniert bevor ich umgestell hab auf Option Strict On

    hoffe das ist ok an infos..!
    hi sonne75, habe aus einen loginform tutorial mir das so zusammen gestellt , bevor ich auf strict on umgestellt habe hat es funktioniert. was ich will ist das man benutzename so wie passwort aus der Source=C:\Temp\userDB.accdb ausgelesen bzw. verglichen wird.....sorry bin anfänger und versuche den fehler raus zu finden

    userDB.accdb

    guccini schrieb:

    For Each rowTest In ds.Tables(0).Rows
    firstName = rowTest("FirstName").ToString
    Next

    guccini schrieb:

    "Option Strict On" lässt spätes Binden nicht zu.
    aha.
    Welchen Datentyp hat rowTest?
    Hilfe: Welchen Datentyp hat das Objekt?

    mal abgesehen davon, dass diese untypisierte Vorgehensweise eh ganz unabsehbar negative Folgen für das Gesamtprojekt hat.

    guccini schrieb:

    was ich will ist das man benutzename so wie passwort aus der Source=C:\Temp\userDB.accdb ausgelesen bzw. verglichen wird

    Du hast in der Datenbank nur eine Row drin, deswegen funktioniert es auch. Wenn du mehrere User haben wirst, wirst du mit diesem Code den letzten Eintrag haben. Deswegen die Frage nochmal: WAS WILLST DU??

    Welchen FirstName willst du auslesen?
    @Higlav doch doch, das ist schon richtig, zumindest wenn man davon ausgehen darf, dass rowTest sonst nirgends deklariert ist. Dann sorgt nämlich das standardmäßig eingeschaltete Option Infer dafür, dass in der For-Each-Zeile rowTest automatisch mit dem benötigten Typ deklariert wird. Und Table.Rows ist vom Typ DataRowCollection und der Enumerator, der bei For Each aufgerufen wird, liefert Objekte vom Typ Object (und nicht DataRow, und schon gar keine typisierte DataRow).
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    "richtig" - untypisiert musses also heißen:

    VB.NET-Quellcode

    1. For Each rowTest As DataRow In ds.Tables(0).Rows
    2. firstName = rowTest("FirstName").ToString
    3. Next
    die DataRowCollection ist ein Uralt-Teil aus 2003, wo es IEnumerable(Of T) noch nicht gab, und daher Option Infer nicht auf T schließen kann.

    Ist ein Riesen-Bockmist, den MS sich geleistet hat, als es 2003 verfrüht rauskam, ohne Generica: Alle Auflistungs-Interfaces IEnumerable, IList, ICollection sind jetzt zweifach vorhanden, und IList(Of T) implementiert IList, was total unintuitiv ist, umständlich zu coden, und solche Fehler wie hier.
    @Arby Ahh! Ok. Das wusste ich nicht. Warum sind denn Zeilen selbst vom Typ Object, wenn doch erst(und spätestens) der Zellinhalt Object ist? ?(
    hi sonne75, habe soweit getestet und funktioniert problemlos mit mehreren benutzer angaben, selbst bei falsche angabe in der textbox1 und textbox2 bekomme ich ein meldung zurück MessageBox.Show("Benutzername,Passwort ist Falsch oder Sie sind nicht Registriert!")

    Higlav schrieb:

    Warum sind denn Zeilen selbst vom Typ Object

    Vielleicht hab ich mich blöd ausgedrückt. Die Zeilen selbst sind schon vom Typ DataRow. Wie ja auch das Beispiel von ErfinderDesRades zeigt. Aber die automatische Typdeklaration im For-Each-Statement holt aus dem Enumerator nur den Typ "Object" raus - wenn man das mal so formulieren darf.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Und ich verstehe immer noch nicht, warum du auf meine Fragen nicht eingehst. Die Zeilen ergeben richtig oder falsch sowieso keinen Sinn, sobald ein zweiter User dazukommt. Wenn er nicht dazukommt, brauchst du auch keine User-Datenbank.

    @guccini
    EDIT: verstehst du eigentlich, was da abläuft? Du hast eine Variable firstName, die in jedem Schleifendurchgang neu gesetzt wird. Am Ende der Schleife hat sie den letztgeschriebenen Wert.
    zunächstmal: Ich bin nicht drauf eingegangen, weil das eine annere Fehler-Ebene ist (ich für mein Teil sehe hier mindestens 3 Fehlerebenen).
    (1) Ich knöpfte mir die konkrete syntaktische vor.
    (2) Weiters sehe ich noch den Konzept-Fehler, dass untypisiert gearbeitet wird.
    (3) Was du ansprichst, ist ein logischer Fehler, oder soll es sein.
    Aber so wie ich sein Sql verstehe fragt er nach einem bestimmten User, mit Name und PW. Also auch wenn viele User, soll die Query nur ein Ergebnis liefern oder keins.
    (also wenns denn mal funzen sollte)

    Edit: (4) Passwort-Abfragen macht man so überhaupt nicht.