4

CSV をデータグリッドにインポートし、次に for-next ループで各行を挿入するルーチンがありますが、7100 行を挿入するのに 18 分かかります。

これで、すでに接続呼び出しをループから外したので、一度だけ実行し、挿入を実行し、終了したら閉じます。

一度に 100 行を一括挿入すると役立つかもしれませんが、それにはおそらく、現在までの行を計算し、次に 100 の非常に多くの後の奇数を計算する複雑なルーチンが必要になるでしょう。

for/next ループなしで 100 行ではなく、データグリッド全体を挿入する簡単な方法はありますか?

以下に示すように、読みやすくするためにクエリ文字列を分割しましたが、これらを 1 行に結合すると大きな違いが生じるでしょうか? あなたが返信するまでに、私はすでにこれを試しているかもしれません:

        con = New MySqlConnection("Data Source=" & vardbpath & ";Database=" & vardbname & ";User ID=" & txtUsername.Text & ";Password=" & txtPassword.Text & ";")
        con.Open()

        For i = 0 To rows - 1
            Query = "INSERT into GENERAL (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,aa,ab,ac,ad)"
            Query &= "values ('"
            Query &= (DataGrid1.Rows(i).Cells(0).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(1).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(2).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(3).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(4).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(5).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(6).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(7).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(8).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(9).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(10).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(11).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(12).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(13).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(14).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(15).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(16).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(17).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(18).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(19).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(20).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(21).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(22).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(23).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(24).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(25).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(26).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(27).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(28).Value)
            Query &= "','" + (DataGrid1.Rows(i).Cells(29).Value)
            Query &= "')"

            Dim cmd As MySqlCommand = New MySqlCommand(Query, con)

            Try
                Dim j As Integer = cmd.ExecuteNonQuery()
                If (j > 0) Then txt_folderactivity.Text &= "Row Successfully Inserted" & vbCrLf
            Catch myerror As MySqlException
                txt_folderactivity.Text &= "Error Executing SQL command: " & myerror.Message & vbCrLf

            End Try
4

2 に答える 2

0

csv 全体をデータグリッドにロードする代わりに、一度に画面一杯 (またはもう少し) だけをロードしてから、ページアップ、ページダウン、または検索で他のレコードを含むページをリロードできます。仮想モードを使用できる場合もあります。

http://msdn.microsoft.com/en-us/library/ms171621.aspx

一度にすべてをロードする巨大なクエリがある場合は、文字列の代わりに stringBuilder を使用することをお勧めします。これにより、別のボトルネックを防ぐことができます。

于 2013-02-13T17:30:42.503 に答える