簡體   English   中英

如何使用vb.net中的參數將mysql數據庫的列值設置為另一個列值

[英]How to set a column value of mysql database as another column value using parameters in vb.net

我需要像下面這樣向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'

因此,udud之后:

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注入字符串的方式。)

好消息是,如果您願意解決此類問題,總有一種方法可以獲取所需的結果。 我可以想到兩種使您的功能按預期工作的方式:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM