簡體   English   中英

VB.net動態參數用於MySql查詢

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

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