Проверка свойства DataReader.HasRows
должна предшествовать методу DataReader.Read()
, который должен быть заключен в цикл While
, поскольку DataReader
- это поток только для пересылки (проверка доступности строки сразу после ExecuteReader()
).Этот пример ниже является правильным способом:
Try
cmd = New Odbc.OdbcCommand("SELECT * FROM tb_user WHERE username = @UserName AND password = @Password", conn)
cmd.Parameters.AddWithValue("@UserName", txt_username.Text)
cmd.Parameters.AddWithValue("@Password", txt_password.Text)
Using rd As OdbcDataReader = cmd.ExecuteReader()
If rd.HasRows = True Then
While rd.Read()
txt_akses.Text = rd!hak_akses
MsgBox("Welcome '" & rd!nama & "'", MsgBoxStyle.Exclamation, "Information")
MenuCustomer.txt_user.Text = rd!username
cmd2 = New Odbc.OdbcCommand("SELECT * FROM tb_permainan WHERE status = 1", conn)
Using rd2 As OdbcDataReader = cmd2.ExecuteReader()
If rd2.HasRows = True Then
While rd2.Read()
If txt_akses.Text = "Customer" Then
If rd.HasRows = False Then
txt_username.Text = ""
txt_password.Text = ""
txt_akses.Text = ""
MenuCustomer.Show()
Else
MsgBox("Game is in progress. Please login for a while", MsgBoxStyle.Exclamation, "Information")
End If
Else
MenuStaff.Show()
End If
End While
End If
End Using
End While
Else
txt_username.Text = ""
txt_password.Text = ""
txt_akses.Text = ""
txt_username.Select()
MsgBox("Incorrect username or password", MsgBoxStyle.Exclamation, "Information")
End If
End Using
Catch ex As Exception
MsgBox(ex.Message)
End Try
Обратите внимание, что для этого случая вы должны использовать разные экземпляры DataReader
, потому что в текущем коде второе присвоение DataReader
перезаписывает первое.Также используйте параметры внутри запроса, чтобы предотвратить попытку внедрения SQL.