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
用于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
编辑:
由于列名不是Username
和Password
而是sUsername
和sPassword
,所以你必须将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:“没有为一个或多个必需参数提供值。”的主要内容,如果未能解决你的问题,请参考以下文章