Vb.net Visual basic System.Data.OleDb.OLEDBEException:“没有为一个或多个必需参数提供值。”
我正在尝试创建一个登录表单,并不断出现以下错误: Visual basic System.Data.OleDb.OLEDBEException:'没有为一个给定值 或更多必需参数。” 我正在用vb使用access数据库,所有的东西都拼写正确,但我一直得到这个错误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
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中的唯一好处。