参数化SQL UPDATE语句

时间:2016-11-16 22:24:12

标签: vb.net ms-access

我已经看过很多参数化SQL查询的例子,但是遇到了一些问题。

我知道我不是哈希密码,所以请不要理会。

以下是我的代码:

cmd.CommandText = "UPDATE users SET username=@uName, pwd=@pWord, role=@uRole, actuser=@uActive WHERE ID=" & recordID
cmd.Parameters.AddWithValue("@uName", tbUsername.Text)
cmd.Parameters.AddWithValue("@pWord", tbPassword1.Text)
cmd.Parameters.AddWithValue("@uRole", cbRole.SelectedItem)
cmd.Parameters.AddWithValue("@uActive", isActive)

我得到的错误是:

  

“条件表达式中的数据类型不匹配”

我不明白为什么因为数据库中的所有内容都是“短字符串”,除了设置为是/否的“执行器”,并且当代码尝试运行时,“isActive”设置为“是”。我已经验证了表列标题是准确的,我不知道为什么这不起作用。

这种格式似乎适用于INSERT语句,但不适用于UPDATE语句......但我现在无法确认。

任何帮助都将不胜感激。

编辑:

更新了相同错误的代码。

 Dim isActive As Boolean = False
    If cbxActive.CheckState = CheckState.Checked Then
        isActive = "True"
    End If

    cmd.CommandText = "UPDATE users SET username=@uName, pwd=@pWord, role=@uRole, actuser=@uActive WHERE ID=@ID"
    cmd.Parameters.AddWithValue("@uName", tbUsername.Text)
    cmd.Parameters.AddWithValue("@pWord", tbPassword1.Text)
    cmd.Parameters.AddWithValue("@uRole", cbRole.SelectedItem.ToString())
    cmd.Parameters.AddWithValue("@uActive", If(isActive, "Yes", "No"))
    cmd.Parameters.AddWithValue("@ID", recordID)

    myConnection.Open()
    Try
        cmd.ExecuteNonQuery()
    Catch ex As OleDb.OleDbException
        MsgBox(ex.Message)
        Exit Sub
    End Try`

SelectedItem从组合框中的集合返回一个字符串。

这是我的数据库结构。Link to Picture of Access DB structure

这是其他结构pic。 enter image description here

1 个答案:

答案 0 :(得分:3)

当然,我们只能猜到isActivecbRole.SelectedItem中的内容,但我们肯定知道其中一个(如果不是两个)导致您的问题。

具体来说,只有在使用直接匹配类型时才能使用AddWithValue。否则你需要像这样精确设置参数数据类型

Dim p As New OleDbParameter(@pName, OleDbType.SomeType)
p.Value = [your value]
cmd.Parameters.Add(p)

在你的情况下,这2行可能是[刮刮]!问题

cmd.Parameters.AddWithValue("@uRole", cbRole.SelectedItem)
cmd.Parameters.AddWithValue("@uActive", isActive)

第一行返回可以是任何东西的对象(只有你知道)。怎么做呢

' If selected item is string
cmd.Parameters.AddWithValue("@uRole", cbRole.SelectedItem.ToString())
' If selected item is integer
cmd.Parameters.AddWithValue("@uRole", CInt(cbRole.SelectedItem))
' If selected item is complex object in which you use property
Dim val As Integer = DirectCast(cbRole.SelectedItem, MyObjectType).SomeIntProperty
cmd.Parameters.AddWithValue("@uRole", val)

' If your value 'isActive' is boolean and you keep Yes/No in DB, you need this
cmd.Parameters.AddWithValue("@uActive", if(isActive, "Yes", "No"))
' and opposite
cmd.Parameters.AddWithValue("@uActive", if(isActive = "Yes", 1, 0))
' you have to be careful here. In .NET false=0, all else <> 0. so, if your business logic needs True=1, all else <> 1, you need to convert correspondingly 

最后一件事 - 为什么不参数化...WHERE ID=" & recordID...?做同样的事情

cmd.CommandText = ". . . . . WHERE ID= @id"
cmd.Parameters.AddWithValue("@id", recordID)