[英]VB.net Dynamic Parameters for MySql query
我再次在這里尋求幫助。
我有一個代碼可以很好地在表中插入記錄
Dim insert4 = "insert into f_logs(f_id, log_Date,log_action,log_Destination,log_status,log_account,log_remarks) " _
& " values(@id,@date,@destination,@destination2,@status,@account,@remarks)"
cmd3 = New MySqlCommand(insert4, conn)
/* cadd is my function for adding values to the parameters */
/* The function simplifies the adding of parameter*/
/* x.Parameters.AddWithValue(para, val) */
cadd(cmd3, "@id", docu_id)
cadd(cmd3, "@date", ToMySql(dt1.Value))
cadd(cmd3, "@destination", get_destination())
cadd(cmd3, "@destination2", tbDestination.Text)
cadd(cmd3, "@status", get_status())
cadd(cmd3, "@account", tbAccount.Text)
cadd(cmd3, "@remarks", tbRemarks.Text)
cmd3.ExecuteNonQuery()
/* cpara is a function for clearing the parameters*/
/* The function simplifies the clearing of parameter */
/* since i am using it frequently*/
cpara(cmd3)
問題來了。 我需要為表中的每個記錄創建日志。 我使用以下代碼獲取日志所需的ID:
SELECT f_id FROM gsis_new.filelocation t2 " _
& " where t2.f_location =@loc"
然后將結果放入隱藏的datagridview中。
我可以使用循環插入為每個id生成的所有日志,但是特別是當我插入100條日志時,逐個執行每個查詢將花費很長時間才能完成。
/* Like using this logic in adding logs */
Start
Add value to parameters
Execute Query
clear parameters
Repeat
這就是為什么我想在一個查詢中插入所有日志,但是我不知道該怎么做。 我需要在運行時在查詢中添加參數。
/* I want to use this logic in adding logs */
Add parameters that is equal to the number of logs to be inserted.
Start
Add value to the parameters
Repeat
Execute Query
clear parameters
----------
更新:
我試圖通過使用以下代碼將其插入一個:
Dim count As Integer = (dgMatchID.Rows.Count() - 1)
Try
Dim watch As New Stopwatch()
If count > 0 Then
cadd(cmd3, "@id", "0")
cadd(cmd3, "@date", ToMySql(dt1.Value))
cadd(cmd3, "@destination", get_destination())
cadd(cmd3, "@destination2", tbDestination.Text)
cadd(cmd3, "@status", get_status())
cadd(cmd3, "@account", tbAccount.Text)
cadd(cmd3, "@remarks", tbRemarks.Text)
For i As Integer = 0 To count - 1
cmd3.Parameters("@id").Value = dgMatchID.Rows(i).Cells("f_id").Value.ToString
cmd3.ExecuteNonQuery()
watch.Start()
Next
watch.Stop()
Dim seconds As Double = watch.Elapsed.TotalSeconds()
MsgBox(seconds)
Else
MsgBox("Nothing to insert!!!")
End If
完成215行的插入需要8.0429649秒。 有什么辦法可以縮短執行時間,我在想,如果我只執行一次MySQLCommand,它將縮短所需的時間。
如果使用的是.NET 4+,則可以使用Parallel Foreach語句插入。 這將並行執行,這將同時插入多個記錄。 這應該更快。 我無法對此進行測試,但是在功能上應該可以。
Dim Options As ParallelOptions = New ParallelOptions With {.MaxDegreeOfParallelism = 100}
不需要上面的選項,您可以將它們全部刪除。 刪除將使.NET根據資源確定要運行的線程數。 您需要確保MaxPool足夠高,以利用將要打開的多個連接
Parallel.ForEach(dgMatchID.Rows.Cast(Of DataGridViewRow), Options,
Function()
Dim insert4 As String = "insert into f_logs(f_id, log_Date,log_action,log_Destination,log_status,log_account,log_remarks) " _
& " values(@id,@date,@destination,@destination2,@status,@account,@remarks)"
Dim conn As New MySqlConnection()
Dim cmd3 As MySqlCommand = New MySqlCommand(insert4, conn)
cmd3.Parameters.AddWithValue("@id", "")
cmd3.Parameters.AddWithValue("@date", "")
cmd3.Parameters.AddWithValue("@destination", "")
cmd3.Parameters.AddWithValue("@destination2", "")
cmd3.Parameters.AddWithValue("@status", "")
cmd3.Parameters.AddWithValue("@account", "")
cmd3.Parameters.AddWithValue("@remarks", "")
Return New With {
Key .Conn = conn,
Key .Cmd = cmd3
}
End Function,
Function(dr, state, localInit)
Dim row As DataGridViewRow = dr
localInit.Cmd.Parameters("@id").Value = row.Cells("f_id").Value.ToString
localInit.Cmd.ExecuteNonQuery()
Return localInit
End Function,
Function(localInit)
localInit.Cmd.Dispose()
localInit.Conn.Dispose()
Return localInit
End Function)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.