我有一个登录表单,我需要检查我的数据库,用户输入的电子邮件和密码是否与数据库匹配。
Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
myConn = New SqlConnection(My.Settings.MySQLData)
myCmd = myConn.CreateCommand
myCmd.CommandText = "SELECT Email FROM dbo.[User]" &
" WHERE Email = '" & tbEmail.Text & "'"
myConn.Open()
myReader = myCmd.ExecuteReader
myReader.Read()
If myReader.IsDBNull(0) Then
MessageBox.Show("The email address input is invalid or does not exist in database.")
ElseIf myReader.GetString(0) <> tbEmail.Text Then
MessageBox.Show("The email address input is invalid or does not exist in database.")
Else
MessageBox.Show("Email address is OK")
End If
myReader.Close()
myConn.Close()
这只是电子邮件部分。我还有一个我尚未输入的密码部分。
上面的代码不起作用。检查数据库登录的最佳方法是什么?
答案 0 :(得分:0)
根据您上面的评论,错误是:
没有数据时无效尝试读取。
这意味着代码假设 SQL查询返回至少一条记录,但是没有记录正在返回。也就是说,没有匹配WHERE
子句条件的记录。
在尝试阅读之前,您应该检查是否存在记录。使用SqlDataReader
时,通常通过检查Read()
方法的布尔结果来完成。例如:
While myReader.Read()
' read the values here, for example:
myReader.GetString(0)
End While
只要myReader.Read()
评估为False
,就意味着查询结果中不再有记录。如果在第一次尝试时评估为False
,则表示查询结果中没有记录。
答案 1 :(得分:0)
来自此处显示的YouTube视频:https://www.youtube.com/watch?v=iyjGP4fP7IE
代码myReader.HasRows
将毫不费力地检查数据库。
我的新代码:
myConn = New SqlConnection(My.Settings.MySQLData)
myCmd = myConn.CreateCommand
myCmd.CommandText = "SELECT Email, Password FROM dbo.[User]" &
" WHERE Email = '" & tbEmail.Text & "'" &
" AND Password = '" & tbPassword.Text & "'"
myConn.Open()
myReader = myCmd.ExecuteReader
If myReader.HasRows Then
LoginScreen.Show()
Else
MessageBox.Show("Invalid Email or Password")
End If
myReader.Close()
myConn.Close()
答案 2 :(得分:0)
如果当前结果集中没有行,则使用HasRows属性可以避免调用DataTableReader的Read方法。 - Msdn
If reader.HasRows Then
myReader.Read()
Else
MessageBox.Show("no data present")
End If