错误:来自 ASP.NET 的 UPDATE 查询中的“没有为一个或多个必需参数提供值”
Posted
技术标签:
【中文标题】错误:来自 ASP.NET 的 UPDATE 查询中的“没有为一个或多个必需参数提供值”【英文标题】:Error: "No value given for one or more required parameters" on UPDATE query from ASP.NET 【发布时间】:2014-01-28 19:05:01 【问题描述】:我收到错误消息
没有为一个或多个必需参数指定值
当我尝试执行以下代码时
Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim t2 = TextBox2.Text
Dim dbcmd As OleDbCommand
dbcmd = New OleDbCommand("UPDATE login1 SET height ='" + TextBox2.Text + "' WHERE username =" + str, dbcon) //This is the part where the error is ....
dbcon.Open()
dbcmd.ExecuteNonQuery()
dbcon.Close()
End Sub
End Class
我尝试在此语句中进行更改,例如使用带有参数的不同方法...但所有代码都显示相同的错误。
【问题讨论】:
我敢打赌,问题在于您使用的输入中有一个参数占位符字符。因此,您面临的问题是您的代码对 SQL 注入完全开放。您需要使用 SQL 参数将用户输入视为 数据 而不是将 is 视为 可执行代码。 【参考方案1】:使用参数化查询绝对是要走的路,但在这种情况下不建议使用命名参数,因为OleDbCommand
对象忽略@时的参数名称987654323@ 是Text
。它们仅依赖于参数在CommandText
中出现的顺序(参考:here)。
因此,首选方法是
Using dbcmd As New OleDbCommand(
"UPDATE login1 SET height=? WHERE username=?",
dbcon)
dbcmd.Parameters.AddWithValue("?", TextBox2.Text) ' height
dbcmd.Parameters.AddWithValue("?", str) ' username
dbcmd.ExecuteNonQuery()
End Using
【讨论】:
【参考方案2】:您没有在查询末尾正确提供用户名。但这不是这里唯一的问题。让我稍微修改一下代码:
Using dbcon As New OleDbConnection(cString)
dbcon.Open()
Using dbcmd As New OleDbCommand(
"UPDATE login1 SET height = @height WHERE username = @username",
dbcon)
dbcmd.Parameters.AddWithValue("@height", TextBox2.Text)
dbcmd.Parameters.AddWithValue("@username", str)
dbcmd.ExecuteNonQuery()
End Using
End Using
注意:using
语句确保对象是 disposed 属性,并且,不要共享连接。当您需要连接、构建、打开、使用和处置。
【讨论】:
虽然不是完全错误,但在这种情况下不鼓励使用 named 参数,因为 ACE.OLEDB 实际上会忽略名称,而仅依赖于 order参数。首选SET height=? WHERE username=?
。
@GordThompson,非常有趣的一点和一个很好的补充 - 非常感谢!以上是关于错误:来自 ASP.NET 的 UPDATE 查询中的“没有为一个或多个必需参数提供值”的主要内容,如果未能解决你的问题,请参考以下文章
来自 UPDATE 查询的“SQL 命令未正确结束”错误 [重复]
如果参数名称等于属性名称,则来自查询的 ASP.NET Core Web API 复杂类型绑定不起作用
Asp.net 客户端验证错误消息不断显示来自 jquery 的值更改
Thingsboard - REST API 上的身份验证错误(来自 Curl 命令和 ASP.NET)