2014-01-09 2 views
-1

Я основываю свои коды у своих профессоров. Я набрал правильное имя пользователя и пароль, но он продолжает говорить недействительный пользователь. Также верно название таблицы. Я не знаю, почему он продолжает говорить, что это недействительный пользователь, любезно помогите мне, пожалуйста.Я не знаю, что с ним не так. Вы можете проанализировать, если это возможно.

If Len(Trim(txtUsername.Text)) = 0 Then 
     MessageBox.Show("Please enter user name", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error) 
     txtUsername.Focus() 
     Exit Sub 
    End If 
    If Len(Trim(txtPassword.Text)) = 0 Then 
     MessageBox.Show("Please enter password", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error) 
     txtPassword.Focus() 
     Exit Sub 
    End If 

    Dim query As String = "SELECT * FROM Users" 
    Dim dt As New DataTable 
    ExecuteQuery(query) 

    Dim ctr As Integer 
    If dt.Rows.Count > 0 Then 
     If (dt.Rows(ctr)("Username")) = txtUsername.Text Then 
      If (dt.Rows(ctr)("Password")) = txtPassword.Text Then 
       frmMainMenu.Show() 
       Me.Hide() 
      End If 
     Else 
      MsgBox("Incorrect password") 
      txtPassword.Text = "" 
      txtPassword.Focus() 
     End If 
    Else 
     MsgBox("Invalid user") 
     txtPassword.Text = "" 
     txtUsername.Text = "" 
     txtUsername.Focus() 

    End If 
+1

Ну, вы выбрали всю таблицу, которая вернет всех пользователей в списке, а затем вы сравните имя пользователя и пароль с одним из них не всех из них. Вы должны быть параметризованы SQL, и вы должны выполнить что-то вроде 'SELECT * FROM Users WHERE username =? и пароль =? ' – Namphibian

ответ

0

Вы никогда не инициализируете dt DataTable. Таким образом, новый DataTable будет иметь 0 строк, и вы попадете в Else of If dt.Rows.Count > 0. Я предполагаю, что вы намеревались быть DataTable, который вытекает из инструкции ExecuteQuery, но поскольку вы не передаете dt и не назначаете результат из ExecuteQuery переменной dt, она по-прежнему остается пустой.

Не зная, что ExecuteQuery делает, я предположил бы, что это должно быть либо

ExecuteQuery(query, dt) 

или

dt = ExecuteQuery(query) 

После чего вы можете попасть в предназначенный блок сравнения имя пользователя/пароль, если есть фактически строки в таблице Users.

Однако ваше соответствие по-прежнему не будет работать, если соответствующая запись не будет первой в DataTable, поскольку вы никогда не выполняете итерацию/увеличение ctr.

0

это мои коды ExecuteQuery()

Dim connectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\nikko\Documents\Visual Studio 2010\Projects\PayrollSystemThesis\PayrollSystemThesis\bin\Debug\Thesis.accdb" 
Public Function ExecuteQuery(ByVal query As String) As DataTable 
    Try 
     Dim dbCon As New OleDbConnection(connectionString) 
     Dim dbDA As New OleDbDataAdapter(query, dbCon) 
     Dim dbCB As New OleDbCommandBuilder(dbDA) 
     Dim dbDT As New DataTable 
     dbDA.Fill(dbDT) 
     Return dbDT 
    Catch ex As Exception 
     MessageBox.Show(ex.Message) 
     Return Nothing 
    End Try 
End Function 

читает SQL заявления.

Смежные вопросы