[英]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.