vb.net - 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
感谢您的时间 :)
解决方案
不要在使用它们的方法之外声明连接。连接需要关闭和处理。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
推荐阅读
- asp.net-mvc - 将列表项分配给模型属性
- ios - 为一个权限显示两个不同的文本
- prometheus - 我怎样才能通过使用 PromQL 来使用这两个指标?
- powershell - 将参数列表单独放入 Powershell 中的不同文件中
- windows - 如何从规范的 Windows 路径中删除 \\?\ 前缀?
- tensorflow - 微调模型时如何继续损失/步骤信息
- python - 在 Selenium 方法中使用 %s
- scala - Scala Monix,如何杀死正在运行或计划的任务
- r - ts() 函数 - 定义唯一的四分位数
- php - 当我将它挂在 php7.0 exetension 中时如何获取函数 args