首页 > 解决方案 > VB.NET 中的登录表单不允许用户在输入正确的登录详细信息之前错误地输入登录详细信息后登录

问题描述

我有一个用 VB.NET 制作的多级访问登录表单,它在后端使用 Access 数据库。

如果用户在两个文本框中都没有输入任何内容时尝试登录(在两个文本框中都没有输入任何内容的情况下按下登录按钮),然后在输入正确的详细信息后尝试登录,则允许登录。

但是,当用户输入错误的用户名或密码时,在输入正确的详细信息后将不允许他们登录。

我也遇到了不区分大小写的问题(只要密码以正确的顺序包含正确的字符,它是大写还是小写都没有关系)。

Imports System.Data.OleDb
Public Class frmLogin
    Private DBCon As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;" &
                                         "Data Source=|DataDirectory|\NewHotel.mdb;")

    Private Sub btnLogIn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLogIn.Click
        If txtUsername.Text = "" Or txtPass.Text = "" Then
            lblErrorEmpty.Visible = True
        Else
            Try
                DBCon.Open()
                Using cmd As New OleDbCommand("SELECT * FROM tblEmployees WHERE [Username] = @Usernname AND [Pass] = @Pass", DBCon)
                    cmd.Parameters.AddWithValue("Username", OleDbType.VarChar).Value = txtUsername.Text.Trim
                    cmd.Parameters.AddWithValue("Pass", OleDbType.VarChar).Value = txtPass.Text.Trim

                    Dim DBDA As New OleDbDataAdapter(cmd)
                    Dim DT As New DataTable
                    DBDA.Fill(DT)

                    If DT.Rows(0)("Type") = "Manager" Then
                        frmHomeManager.Show()
                    ElseIf DT.Rows(0)("Type") = "Receptionist" Then
                        frmHomeReceptionist.Show()
                    End If
                End Using
            Catch ex As Exception
                lblErrorMatch.Visible = True
            End Try
        End If
    End Sub

感谢您的时间 :)

标签: vb.netms-access

解决方案


不要在使用它们的方法之外声明连接。连接需要关闭和处理。Using...End Using即使出现错误,块也会处理此问题。

我已将用户界面代码与数据库代码分开。这使得代码更容易维护

对于 OleDb .Add,参数方法会有所帮助。在.Execute. 您只检索一条数据,所以.ExecuteScalar应该这样做。

Private ConStr As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\NewHotel.mdb;"

Private Sub btnLogIn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLogIn.Click
    If txtUsername.Text = "" OrElse txtPass.Text = "" Then
        MessageBox.Show("Please fill in both User Name and Password")
        Exit Sub
    End If
    Dim UserType As Object
    Try
        UserType = GetUserType(txtUsername.Text.Trim, txtPass.Text.Trim)
    Catch ex As Exception
        MessageBox.Show(ex.Message)
        Exit Sub
    End Try
    If UserType Is Nothing Then
        MessageBox.Show("No record found")
    ElseIf UserType.ToString = "Manager" Then
        frmHomeManager.Show()
    ElseIf UserType.ToString = "Receptionist" Then
        frmHomeReceptionist.Show()
    Else
        MessageBox.Show($"{UserType} is not listed.")
    End If
End Sub

Private Function GetUserType(UserName As String, Password As String) As Object
    Dim Type As Object
    Using DBCon As New OleDb.OleDbConnection(ConStr),
        cmd As New OleDbCommand("SELECT Type FROM tblEmployees WHERE [Username] = @Usernname AND [Pass] = @Pass", DBCon)
        cmd.Parameters.Add("@Username", OleDbType.VarChar).Value = UserName
        cmd.Parameters.Add("@Pass", OleDbType.VarChar).Value = Password
        DBCon.Open()
        Type = cmd.ExecuteScalar.ToString
    End Using
    Return Type
End Function

推荐阅读