使用Vb.net根据用户类型从登录表单重定向

时间:2015-11-11 13:03:56

标签: vb.net ms-access login

假设我有一个存储 3 属性的登录表:

  1. USERNAME
  2. PASSWORD
  3. USERTYPE
  4. 请注意,我使用的是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,以便整个应用程序都可以访问。但是当我调试应用程序时,没有错误,当我点击登录按钮时,没有任何反应。

3 个答案:

答案 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部分,并显示消息"不正确的用户名或密码。"