Vb.net Visual basic System.Data.OleDb.OLEDBEException:“没有为一个或多个必需参数提供值。”

Vb.net Visual basic System.Data.OleDb.OLEDBEException:“没有为一个或多个必需参数提供值。”,vb.net,ms-access,Vb.net,Ms Access,我正在尝试创建一个登录表单,并不断出现以下错误: Visual basic System.Data.OleDb.OLEDBEException:'没有为一个给定值 或更多必需参数。” 我正在用vb使用access数据库,所有的东西都拼写正确,但我一直得到这个错误 Private Sub Btn_Login_Click(sender As Object, e As EventArgs) Handles Btn_Login.Click If DbConnect() Then

我正在尝试创建一个登录表单,并不断出现以下错误:

Visual basic System.Data.OleDb.OLEDBEException:'没有为一个给定值 或更多必需参数。”

我正在用vb使用access数据库,所有的东西都拼写正确,但我一直得到这个错误

Private Sub Btn_Login_Click(sender As Object, e As EventArgs) Handles Btn_Login.Click
    If DbConnect() Then
        Dim SQLCmd As New OleDbCommand
        With SQLCmd
            .Connection = cn
            .CommandText = "Select * From Tbl_Staff Where (Username = @sUsername) and (Password = @sPassword)"
            .Parameters.AddWithValue("@sUsername", Txt_Username.Text)
            .Parameters.AddWithValue("@sPassword", Txt_Password.Text)

            Dim rs As OleDbDataReader = .ExecuteReader()

            If rs.Read Then
                PublicFirstname = rs("Firstname")
                PublicStaffID = rs("StaffID")
                'PublicAccessLevel = rs("AccessLevel")
                frmMainMenu.Show()
            Else
                MsgBox("Sorry, incorrect log in details entered")
            End If
            rs.Close()
编辑: 更改了我的代码,但仍然收到相同的错误:

If DbConnect() Then
    Using SQLCmd As New OleDbCommand
        With SQLCmd
            .Connection = cn
            .CommandText = "Select * From Tbl_Staff Where (Username = ?) and ([Password] = ?)"
            .Parameters.Add("@sUsername", OleDbType.VarChar).Value = Txt_Username.Text
            .Parameters.Add("@sPassword", OleDbType.VarChar).Value = Txt_Password.Text

            Using rs As OleDbDataReader = .ExecuteReader()
                If rs.Read Then
                Else
                    MsgBox("Sorry, incorrect log in details entered")
                End If
                rs.Close()
            End Using
        End With
    End Using
End If

我在这里看到两个问题

不支持CommandType设置为Text的命名参数。提供这些参数的顺序很重要。 是ms-access中的保留字。请将其放在方括号中。 其他需要加强的东西

用于OleDbCommand和OleDbDataReader。 不要以明文形式存储密码。 因此,您的代码应该如下所示:

Using SQLCmd As New OleDbCommand
    With SQLCmd
        .Connection = cn
        .CommandText = "Select * From Tbl_Staff Where (Username = ?) and ([Password] = ?)"
        .Parameters.Add("@sUsername", OleDbType.VarChar).Value = Txt_Username.Text
        .Parameters.Add("@sPassword", OleDbType.VarChar).Value = Txt_Password.Text

        Using rs As OleDbDataReader = .ExecuteReader()
            If rs.Read Then
            Else
                MsgBox("Sorry, incorrect log in details entered")
            End If
            rs.Close()
        End Using
    End With
End Using
编辑: 由于列名不是用户名和密码,而是sUsername和sPassword,因此必须按如下方式更改CommandText:

.CommandText = "Select * From Tbl_Staff Where (sUsername = ?) and (sPassword = ?)"

尝试在[]s.CommandText=Select*中包装密码,其中Username=@sUsername和[password]=@sPassword password是OLEDB中的保留关键字,但仍然无法使用我可以尝试的任何其他内容?喂,在哪一行出现错误?sPassword是否可以访问?是的,但列名似乎是password。要将其用作列名称,您必须将其放在方括号中:[密码]我尝试过,现在得到System.InvalidCastException:“OLEDBPParameterCollection只接受非空的OLEDBPParameter类型对象,而不接受字符串对象。”作为错误,抱歉,需要以不同方式添加参数。我已经编辑了我的答案。我将补充说,我更喜欢@Name,因为它使阅读代码中的语句更容易理解,但这是它在Access中的唯一好处。