每次尝试使用不正确的详细信息登录时都会收到此错误,这些错误信息应显示消息框"用户名无效..."如果没有输入详细信息,则应显示"请输入...
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
答案 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注入攻击(更不用说语法错误,如果你的一些文本框包含单引号,试试看.. 。)
另外,从安全角度考虑,您不应该以明文形式在数据库中存储密码。始终使用密码哈希