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

时间:2015-09-03 17:45:51

标签: mysql vb.net

我需要向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'

我想使用上面的函数执行此操作(因此我可以将其用于所有更新查询)

1 个答案:

答案 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