我无法修复代码,它总是显示没有给出一个或多个参数的值。我想知道我应该修改什么来修复它。我的数据库是Access 2007
尝试
dataB = "Update login set username = '" & txtUserName.Text.Replace("'", "''") & "' , dateofb = '" & dtpDOB1.Text.Replace("'", "''") & "', placeofb = '" & txtPOB.Text.Replace("'", "''") & "', email = '" & txtEmailID.Text.Replace("'", "''") & "' where userid = " & useridlbl.Text
ConnDB()
cmd = New OleDbCommand(dataB, conn)
Dim i As Integer
i = cmd.ExecuteNonQuery
If i > 0 Then
MsgBox("Update Succesfully", MsgBoxStyle.Information, "Confirmation")
Me.Dispose()
userinfofrm.Show()
Else
MsgBox("Failed Updating", MsgBoxStyle.Information, "Alert!")
End If
Catch ex As Exception
MsgBox(ex.Message)
Finally
cmd.Dispose()
conn.Close()
End Try
答案 0 :(得分:3)
根据查询,我怀疑电子邮件地址是问题的根源,因为它包含@
个字符。 OleDbCommand将此解释为参数,因此查找参数值。由于未指定参数值,因此会引发错误。
为了解决这个问题,请立即更好地使用查询中的参数。虽然您在语句中转义单引号,但使用参数以防止SQL注入攻击会更安全。参数还避免了有关日期值等区域特定格式的问题。此外,使用参数化查询允许数据库服务器(或MS访问)为后续请求缓存查询计划。
按如下方式更改您的陈述:
dataB = "Update login set username = @userName, dateofb = @dateOfB, " + _
"placeofb = @placeOfB, email = @email where userid = @userId "
ConnDB()
cmd = New OleDbCommand(dataB, conn)
cmd.Parameters.AddWithValue("@userName", txtUserName.Text)
cmd.Parameters.AddWithValue("@dateOfB", DateTime.Parse(dtpDOB1.Text)) ' Maybe your control can provide you with the DateTime value right away
cmd.Parameters.AddWithValue("@placeOfB", txtPOB.Text)
cmd.Parameters.AddWithValue("@email", txtEmailID.Text)
cmd.Parameters.AddWithValue("@userId", useridlbl.Text)
Dim i As Integer
i = cmd.ExecuteNonQuery
' ...
请注意,我使用了MS Access可以理解的命名参数语法。其他OleDB提供程序可能需要以问号形式提供未命名的参数。正如@Steve在评论中指出的那样,语句中参数的顺序应与它们添加到Parameters
集合的顺序相匹配。