用于MySql查询的VB.net动态参数

时间:2017-03-23 20:04:43

标签: mysql vb.net

我再来一次,寻求帮助。

我有一个代码可以在我的表中插入记录

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,它所需的时间就会缩短。

1 个答案:

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