假设我有一个存储 3 属性的登录表:
请注意,我使用的是Access数据库
在我的 login.vb 表单中,有2个文本框供用户输入其用户名和密码。并使用一个登录按钮验证登录信息。
我的问题是如何根据userType重定向窗体。 以下是 login.vb 的代码。
Private Sub btn_login_Click(sender As System.Object, e As System.EventArgs) Handles btn_login.Click
Dim mysql As String = "SELECT COUNT(*) AS NUM_MATCHES FROM TABLE WHERE USERNAME='" & username.Text & "' and PASSWORD ='" & password.Text & "'"
Dim mydatatable As New DataTable
Dim myreader As New OleDb.OleDbDataAdapter(mysql, myconnection)
myreader.Fill(mydatatable)
Dim num_matches As String = mydatatable.Rows(0).Item("NUM_MATCHES")
If num_matches = 1 Then
If userType = "CUSTOMER" Then
username = username.Text
form_customer.Show()
Me.Hide()
ElseIf userType = "STAFF" Then
form_staff.Show()
Me.Hide()
End If
Else
txt_username.Text = ""
txt_password.Text = ""
MsgBox("Incorrect Username or Password")
End If
End Sub
我在模块中将userType
设置为Public userType As String
,以便整个应用程序都可以访问。但是当我调试应用程序时,没有错误,当我点击登录按钮时,没有任何反应。
答案 0 :(得分:1)
有一种可能的情况是,发布的代码不会抛出错误但不会打开表单或显示消息框:当num_matches为1但userType既不是“CUSTOMER”也不是“STAFF”时。
正如评论中所指出的,您的代码不会为userType分配值。我假设它需要在这里这样做。我自己不使用MS Access,但我确实使用MySQL,并且您当前的查询仅返回匹配计数,而不返回任何其他列值,例如USERTYPE。您需要修改查询或添加第二个查询以获取VB userType变量的信息。也许这会奏效:
Dim mysql As String = "SELECT COUNT(*) AS NUM_MATCHES, USERTYPE..."
...
userType = mydatatable.Rows(0).Item("USERTYPE")
这只是我的猜测,因为我使用MySql.Data.MySqlClient类进行查询,但你仍然可以理解。
答案 1 :(得分:1)
你真的应该阅读所有的答案...... Irene基本上已经给了你所需要的一切......这里是你的代码的重写。
Private Sub btn_login_Click(sender As System.Object, e As System.EventArgs) Handles btn_login.Click
Dim mysql As String = "SELECT * FROM TABLE WHERE USERNAME='" & username.Text & "' and PASSWORD ='" & password.Text & "'"
Dim mydatatable As New DataTable
Dim myreader As New OleDb.OleDbDataAdapter(mysql, myconnection)
myreader.Fill(mydatatable)
If mydatatable.Rows.Count = 1 Then
'we have a row
'assign userType
userType = mydatatable.Rows(0).Item("USERTYPE")
If userType = "CUSTOMER" Then
username = username.Text
form_customer.Show()
Me.Hide()
ElseIf userType = "STAFF" Then
form_staff.Show()
Me.Hide()
End If
Else
txt_username.Text = ""
txt_password.Text = ""
MsgBox("Incorrect Username or Password")
End If
End Sub
请注意,上面的代码没有解决sql注入的问题。
答案 2 :(得分:0)
我有点想知道你为什么要在select语句中计算匹配,然后通过查看数据表中有多少行来检查匹配的数量。
您的逻辑设置方式,只要找到用户名和密码,您就匹配了。因此,执行if子句中的代码。正如其他人所说,你没有在这里给userType分配任何东西。您可以通过向代码添加ELSE子句来证明这是问题:
If num_matches = 1 Then
If userType = "CUSTOMER" Then
username = username.Text
form_customer.Show()
Me.Hide()
ElseIf userType = "STAFF" Then
form_staff.Show()
Me.Hide()
Else
MsgBox("Incorrect user type.")
End If
Else
txt_username.Text = ""
txt_password.Text = ""
MsgBox("Incorrect Username or Password")
End If
如果我正在编写此代码,我会更改SQL语句以根据用户名和密码选择userType。您不需要使用count(*),只需测试数据表中的行数并采取相应的行动。
顺便说一下,如果表格中的相同用户名/密码组合可能会在不同的用户类型中包含两次,那么您的测试应该是If num_matches >= 1 Then
而不是If num_matches = 1 Then
好吧,因为在有多个匹配的情况下,执行将跳转到语句的Else部分,并显示消息"不正确的用户名或密码。"