在调用Read()vb.NET和MySQL之前无法尝试访问字段

时间:2015-12-29 16:55:13

标签: mysql vb.net

每次尝试使用不正确的详细信息登录时都会收到此错误,这些错误信息应显示消息框"用户名无效..."如果没有输入详细信息,则应显示"请输入...

    conn = New MySqlConnection
    conn.ConnectionString = "server=localhost; userid=root; password=...; database=..."
    Dim reader As MySqlDataReader

    Try
        conn.Open()
        Dim Query As String
        Query = "SELECT Username, Password, Admin FROM appointments.tblLogin WHERE Username='" & TextBox_Username.Text & "' AND Password='" & TextBox_Password.Text & "' "
        cmd = New MySqlCommand(Query, conn)
        reader = cmd.ExecuteReader

        Dim count As Integer
        count = 0
        While reader.Read
            count = count + 1
        End While

        If reader.GetInt32("Admin") = 1 Then
            AdminMainMenu.Show()
            Me.Hide()
        ElseIf reader.GetInt32("Admin") = 0 Then
            MainMenu.Show()
            Me.Hide()
        Else
            MessageBox.Show("Invalid username or password")
        End If

        If TextBox_Username.Text.Equals("") And TextBox_Password.Text.Equals("") Then
            MessageBox.Show("Please enter a username and password")
        End If

        conn.Close()

    Catch ex As MySqlException
        MessageBox.Show(ex.GetBaseException.ToString)
    Finally
        conn.Dispose()
    End Try

1 个答案:

答案 0 :(得分:0)

MySqlDataReader只能向前移动,一旦到达命令检索到的行的末尾,它就无法返回读取前一行。
用于计算行数的循环将读取器移动到数据流的末尾。因此,尝试阅读Admin字段会导致异常。

If TextBox_Username.Text.Equals("") And _
   TextBox_Password.Text.Equals("") Then
    MessageBox.Show("Please enter a username and password")
   Return
End If

.... opening and executing the command code....

If reader.Read Then
    Dim isAdmin = (reader.GetInt32("Admin") = 1)
    If isAdmin Then
       AdminMainMenu.Show()
       Me.Hide()
    Else Then
       MainMenu.Show()
       Me.Hide()
    End If
Else 
    MessageBox.Show("Invalid username or password")
End If
conn.Close()

请注意,我已经删除了循环并在Read方法周围使用了一个简单的if / else语句来显示错误消息,并且我已经更改了Admin标志的读取,创建了一个布尔变量来简化逻辑内部的逻辑。 if块。

说,你需要看一下构建参数化查询的方式,因为构建命令文本的字符串连接会使你的程序暴露给Sql注入攻击(更不用说语法错误,如果你的一些文本框包含单引号,试试看.. 。)

另外,从安全角度考虑,您不应该以明文形式在数据库中存储密码。始终使用密码哈希