gpt4 book ai didi

mysql - 如何使用vb.net中的参数将mysql数据库的列值设置为另一个列值

转载 作者:行者123 更新时间:2023-11-29 22:03:34 29 4
gpt4 key购买 nike

我需要向 mysql 发送更新查询,如下所示:

UPDATE myTableName SET OldField = NewField, NewField = 'New Value'
WHERE myFieldName = 'myFieldValue'

更新时我需要将“NewField”字段的旧值存储在“OldField”字段中,但我还需要使用参数进行更新。

问题是我不知道如何将“NewField”(作为字段名称)作为参数发送,如以下函数所示:

Public Function DBUpdate(ByVal connectionString As String, ByVal Tbl As String, ByVal FldsNValues As Dictionary(Of String, String), Optional ByVal Whe As String = "") As Boolean
Dim iReturn As Boolean
Using SQLConnection As New MySqlConnection(connectionString)
Using sqlCommand As New MySqlCommand()
Dim CmdTxt$ = "UPDATE " & Tbl & " SET "
For Each k In FldsNValues.Keys
CmdTxt &= k & " = @" & k & ", "
Next
CmdTxt = CmdTxt.Substring(0, CmdTxt.Length - 2)
If Whe <> "" Then
CmdTxt &= " WHERE " & Whe
End If
With sqlCommand
.CommandText = CmdTxt
.Connection = SQLConnection
.CommandType = CommandType.Text
For Each k In FldsNValues.Keys
.Parameters.AddWithValue("@" & k, FldsNValues(k))
Next
End With
Try
SQLConnection.Open()
sqlCommand.ExecuteNonQuery()
iReturn = True
Catch ex As MySqlException
MsgBox(ex.Message.ToString)
iReturn = False
Finally
SQLConnection.Close()
End Try
End Using
End Using
Return iReturn
End Function

如何将字段名称设置为参数?

可能吗?

这是我想要的示例:

TABLE "Baby" RECORD BEFORE UPDATE

Fld_Id | Fld_Name | Fld_OldValue | Fld_NewValue
1 | Sally | 12 years old | 14 years old

然后我更新:

UPDATE Baby SET Fld_OldValue = Fld_NewValue, Fld_NewValue = '15 years old'
WHERE Fld_Name = 'Sally'

所以,在更新之后:

TABLE "Baby" RECORD AFTER UPDATE

Fld_Id | Fld_Name | Fld_OldValue | Fld_NewValue
1 | Sally | 14 years old | 15 years old

我想使用上面的函数来执行此操作(这样我就可以将它用于所有更新查询)

最佳答案

好的,我想我现在明白你的问题了。希望第三次有魅力。

问题似乎在于您尝试参数化 SET Fld_OldValue = Fld_NewValue,但无法将 Fld_NewValue 传递为一个参数。 (相反,您的函数可能会传递字符串“Fld_NewValue”。)

不幸的是,您无法按照您尝试的方式做您想做的事。根据定义,参数是一列和一个值。它们是 VB.NET sqlControl 类的一部分,可将数据与 SQL 命令一起传递,但它们本身不能传递 SQL 指令。 (事实上​​,这种行为是使用参数的主要原因之一,因为这就是参数化防止字符串中的 SQL 注入(inject)的方式。)

好消息是,如果您愿意解决此类问题,总有办法获得您正在寻找的结果。我可以想到两种方法让你的函数按预期工作:

1) 编写一个辅助函数,为每个字段返回正确的值。

此函数应该 (1) 确定存储在字典中的“值”是否真正是一个值或实际上是一个列名,(2) 执行查询以在传递列时获取存储在适当列中的值名称,(3) 返回适当的值。然后,您可以在上面的函数中使用此函数来确保设置了正确的值。

2) 对相关列使用非参数化 SQL。

这将需要对您的函数进行重大重写,因为语法 SET k = @k 并不总是正确的。您必须在同一循环中单独添加每个命令(以及参数(如果适用))。像这样的东西:

.CommandText &= k & " = "
If isColumn(k) Then 'You must determine how to evaluate this yourself
.CommandText &= FldsNValues(k)
Else
.CommandText &= "@" & k
.Parameters.AddWithValue("@" & k, FldsNValues(k))
End If

关于mysql - 如何使用vb.net中的参数将mysql数据库的列值设置为另一个列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32382256/

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