我再来一次,寻求帮助。
我有一个代码可以在我的表中插入记录
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,它所需的时间就会缩短。
答案 0 :(得分:0)
如果您使用的是.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)