不删除一个或多个参数的值

时间:2016-02-12 07:33:52

标签: sql vb.net ms-access

我无法修复代码,它总是显示没有给出一个或多个参数的值。我想知道我应该修改什么来修复它。我的数据库是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

1 个答案:

答案 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集合的顺序相匹配。