我需要向mysql发送更新查询,如下所示:
isDraft
我需要存储字段的旧值" NewField"在现场" OldField"更新时,我还需要使用参数进行更新。
问题在于我不知道如何发送" NewField" (作为字段的名称)作为参数,如下面的函数:
UPDATE myTableName SET OldField = NewField, NewField = 'New Value'
WHERE myFieldName = 'myFieldValue'
如何将字段名称设置为参数?
有可能吗?
这是我想要的一个例子:
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
所以,在udate之后:
UPDATE Baby SET Fld_OldValue = Fld_NewValue, Fld_NewValue = '15 years old'
WHERE Fld_Name = 'Sally'
我想使用上面的函数执行此操作(因此我可以将其用于所有更新查询)
答案 0 :(得分:0)
好的,我想我现在能得到你所要求的。希望第三次是魅力。
问题似乎是您尝试参数化SET Fld_OldValue = Fld_NewValue
,但无法将列 Fld_NewValue
作为参数传递。 (相反,您的函数可能正在传递字符串“Fld_NewValue”。)
不幸的是,你无法以你想要的方式做你想做的事。根据定义,参数是列和值。它们是VB.NET sqlControl类的一部分,它将 data 与SQL命令一起传递,但它们不能自己传递SQL指令。 (实际上,这种行为是使用参数的主要原因之一,因为这是参数化防止字符串中SQL注入的方式。)
好消息是,如果您愿意解决此类问题,总有办法获得您正在寻找的结果。我可以想出两种方法让你的功能按预期工作:
1)编写一个辅助函数,为每个字段返回正确的值。
此函数应该(1)确定字典中存储的“值”是否真的是一个值,或者实际上是一个列名,(2)执行查询以在传递列时获取存储在相应列中的值name,和(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