我已经看过很多参数化SQL查询的例子,但是遇到了一些问题。
我知道我不是哈希密码,所以请不要理会。 p>
以下是我的代码:
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
答案 0 :(得分:3)
当然,我们只能猜到isActive
和cbRole.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)