【发布时间】:2023-03-31 06:22:01
【问题描述】:
我正在编写一个程序,当用户在列表视图中选择一条记录时,它会更新密码或积分。我收到一个错误“没有为 1 个或多个必需参数提供值”,我不知道如何纠正,我是否遗漏了一些明显的东西?
Dim sql As String = "UPDATE Users SET [Password] = @2,[LoyaltyPoints] = @3 WHERE [Username] = '" & mListView.SelectedItems(0).Text & "'"
cmd = New OleDbCommand(sql, con)
'ADD PARAMETER
cmd.Parameters.AddWithValue("@1", UpdatedUser)
cmd.Parameters.AddWithValue("@2", UpdatedPass)
cmd.Parameters.AddWithValue("@3", UpdatedPoints)
'OPEN CONNECTION,EXECUTE UPDATE,CLOSE CONNECTION'
Try
con.Open()
adapter = New OleDbDataAdapter(cmd)
adapter.UpdateCommand = con.CreateCommand()
adapter.UpdateCommand.CommandText = sql
If (adapter.UpdateCommand.ExecuteNonQuery() = 0) Then 'Error Appears Here
MsgBox("Successfully Updated")
ClearAll()
Else
MsgBox("Unsuccessful")
End If
con.Close()
Retrieve()
Catch ex As Exception
MsgBox(ex.Message)
con.Close()
End Try
End Sub
【问题讨论】:
-
你能说明你在哪里获得更新用户/通行证/积分的值吗?
-
您的代码仍然容易被 sql 注入攻击。您还应该参数化您的用户名。
-
``` UpdatePass = edtUpdatePass.Text If UpdatePass = Nothing Then MsgBox("请确保整个表单已完成", MsgBoxStyle.Critical) ElseIf Val(edtUpdatePoints.Text) = 0 Then MsgBox(" Base Loyalty Points must be a Number", MsgBoxStyle.Critical) End If UpdatePoints = edtUpdatePoints.Text UpdateLV(sSelectedUser, UpdatePass, UpdatePoints) End If ``` 我的变量在哪里
-
我很确定参数名称不能以数字开头:
@1= 失败,@p1= 成功。另外,虽然使用SQL参数是正确的,但请注意AddWithValue is Evil、AddWithValue is evil!和Can we stop using AddWithValue() already?。 -
@AndrewMorton 如果我将参数名称替换为“@P1”、“@P2”和“@P3”,我会得到同样的错误,我应该使用什么来代替 AddWithValue()?