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

Posted

技术标签:

【中文标题】Visual basic System.Data.OleDb.OleDbException:“没有为一个或多个必需参数提供值。”【英文标题】:Visual basic System.Data.OleDb.OleDbException: 'No value given for one or more required parameters.' 【发布时间】:2018-05-28 10:56:59 【问题描述】:

我正在尝试制作登录表单并不断收到此错误:

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

我正在使用带有 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

【问题讨论】:

尝试在 [ ] 的 .CommandText = "Select * From Tbl_Staff Where (Username = @sUsername) and ([Password] = @sPassword)" 中包装密码 密码是 OleDb 中的保留关键字 那我还可以尝试其他什么都行不通? 你好,你在哪一行得到错误? 【参考方案1】:

我发现这里有两个问题。

    OleDbCommand 不支持将 CommandType 设置为 Text 的命名参数。提供它们的顺序很重要。 PASSWORD 是 ms-access 中的保留字。放在方括号中。

其他要增强的东西。

Using 用于OleDbCommandOleDbDataReader。 不要以明文形式存储密码。

所以你的代码应该如下所示:

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

编辑: 由于列名不是UsernamePassword而是sUsernamesPassword,所以你必须将CommandText改成如下:

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

【讨论】:

sPassword 不支持 Access 吗? 是的,但列名似乎是 Password。要将其用作列名,您必须将其放在方括号中:[Password] 我试过了,现在我得到 System.InvalidCastException: 'OleDbParameterCollection 只接受非空 OleDbParameter 类型的对象,而不是字符串对象。'作为一个错误 对不起,需要添加不同的参数。我已经编辑了我的答案。 我要补充一点,我更喜欢@Name,因为它使阅读代码中的语句时更容易理解,但这是它在 Access 中的唯一好处。

以上是关于Visual basic System.Data.OleDb.OleDbException:“没有为一个或多个必需参数提供值。”的主要内容,如果未能解决你的问题,请参考以下文章

text Visual Basic代码Emmet

text Visual Basic代码片段

text Visual Basic代码命令

text Visual Basic代码Vue设置

text Visual Basic代码Vue扩展/插件

text Visual Basic的字典打印机