2011-12-07 2 views
0

У меня есть ошибка ОШИБКА [22018] [Microsoft] [ODBC Microsoft Access Driver] Несоответствие типов данных в выражении критериев., и я пытался решить эту проблему, но, к сожалению, я не смог получить эту ошибку. Я новичок в dotNet.ОШИБКА [22018] [Microsoft] [ODBC Microsoft Access Driver] Несоответствие типов данных в выражении критериев

Public Sub LogInContinue(ByVal senter As Object, ByVal e As EventArgs) 
    Dim LibDS As DataSet = New DataSet 
    Dim LibDA As OdbcDataAdapter = New OdbcDataAdapter("SELECT * FROM tblUserAccount WHERE Uname='" & txtUserName.Text & "'", LibConn) 
    Dim A As Integer 
    LibDS.Tables.Add("tblUserAccount") 
    A = LibDA.Fill(LibDS, "tblUserAccount") 

    If A = 0 Then 
     MessageBox.Show("Username you have supplied is invalid!" & vbCrLf & "Please click OK button to try again.", "INVALID USERNAME", MessageBoxButtons.OK, MessageBoxIcon.Error) 
    Else 
     If LibDS.Tables(0).Rows(0)("Uname") = Me.txtUserName.Text AndAlso LibDS.Tables(0).Rows(0)("Password") = Me.txtPassword.Text Then 
      NewUserID.UUserID = LibDS.Tables(0).Rows(0)("UserID") 
      UserAcceptedRole() 
     Else 
      MessageBox.Show("Password you have supplied is invalid." & vbCrLf & "Please try again!", "PASSWORD MISMATCHED", MessageBoxButtons.OK, MessageBoxIcon.Error) 
     End If 
    End If 
End Sub 

Private Sub UserAcceptedRole() 
    Dim ActualRole As String 
    Dim LibDSa As DataSet = New DataSet 
    Dim LibDAa As OdbcDataAdapter = New OdbcDataAdapter("SELECT * FROM tblRoles WHERE UserID='" & NewUserID.UUserID & "'", LibConn) 
    LibDSa.Tables.Add("tblRoles") 
    LibDAa.Fill(LibDSa, "tblRoles") 

    ActualRole = LibDS.Tables(0).Rows(0)("Role").ToString 
    If ActualRole = "Member" Then 
     lblWelcome.Text = "Welcome " & txtUserName.Text 
     NewObject.NewLabel(lblID, "You are logged in as " & ActualRole, "Calibri", 12, FontStyle.Regular, 666, 40) 
     btnLogIn.Text = "Logout" 
    End If 
End Sub 

Ошибка в коде LibDAa.Fill(LibDSa, "tblRoles") под Private Sub UserAcceptedRole(). Пожалуйста, скажите мне, что это за ошибка? и если у вас есть советы по улучшению моего кода (стиля), любезно скажите мне. Благодаря нагрузкам.

+0

Каков тип поля UserID для tblRoles? и удалите statmenet - LibDSa.Tables.Add ("tblRoles"). – adatapost

+0

@AVD Это ** Номер ** – aer

+0

Теперь отлаживаем (или добавляем точку останова) метод UserAcceptedRole() и проверяем значение ** NewUserID.UUserID **. Номер NewUserID.UUserID является номером? – adatapost

ответ

1

Всегда используйте параметры (параметризованный оператор SQL). Подробнее о Parameters и SQL Injection.

Private Sub UserAcceptedRole() 
    Dim ActualRole As String 
    Dim LibDt As New DataTable 
    Dim Cmd As New OdbcCommand 
    Cmd.CommandText="SELECT * FROM tblRoles WHERE [email protected]" 
    Cmd.Connection=LibConn 

    MsgBox("Verifying the value of : " & NewUserID.UUserID) 

    Cmd.Parameters.Add("@UserID",System.Data.Odbc.OdbcType.Int).Value=NewUserID.UUserID 

    Dim LibDAa As OdbcDataAdapter = New OdbcDataAdapter(Cmd) 
    LibDAa.Fill(LibDt) 

    If LibDt.Rows.Count<>0 Then 

     ActualRole = LibDt.Rows(0)("Role").ToString 

     If ActualRole = "Member" Then 
     lblWelcome.Text = "Welcome " & txtUserName.Text 
     .... 
     End If 
    End If 
End Sub 

PS: Вы можете использовать DataSet тоже.

+0

** ОШИБКА [07002] [Microsoft] [ODBC Microsoft Access Driver] Слишком мало параметров Ожидаемое 1. ** Что это за ошибка? – aer

+0

@aerohn - Может быть имя таблицы или поля написано с ошибкой. Пожалуйста, проверьте имя таблицы и поля в базу данных Ms-Access. – adatapost

+0

Моя база данных MSAccess - это версия 2003 года, созданная на другом компьютере. У меня только MSAccess2007 на моем компьютере, вы думаете, что версия программного обеспечения конфликтует? Я все еще мог открыть базу данных, созданную в Access2003 n my – aer

2

Идентификатор пользователя может быть Integer типа так попытайтесь удалить «» из запроса, которые окружают идентификатор пользователя, как «232» и т.п .. Ошибка может быть в следующем заявлении:

Dim LibDAa As OdbcDataAdapter = New OdbcDataAdapter("SELECT * FROM tblRoles WHERE UserID='" & NewUserID.UUserID & "'", LibConn) 

Проверить это : LibDS является локальным для этого SUB

Public Sub LogInContinue(ByVal senter As Object, ByVal e As EventArgs) 
    Dim LibDS As DataSet = New DataSet /// local to this sub 

Как вы можете получить доступ к этому в другой SUB UserAcceptedRole()

ActualRole = LibDS.Tables(0).Rows(0)("Role").ToString 

Лучший подход заключается в том, что вы передаете роль в качестве параметра.

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