gpt4 book ai didi

vb.net - 参数化 SQL UPDATE 语句

转载 作者:行者123 更新时间:2023-12-02 01:06:30 26 4
gpt4 key购买 nike

我见过很多参数化 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)

我得到的错误是:

"Data type mismatch in criteria expression"

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

这种格式似乎适用于 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

这是另一个结构图。 enter image description here

最佳答案

当然,我们只能猜测 isActivecbRole.SelectedItem 中的内容,但我们确信其中之一(如果不是两者)都会导致您的问题。

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

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

在你的情况下,这两行可能是[从头开始]!有问题

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)

关于vb.net - 参数化 SQL UPDATE 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40643469/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com