0

datagridview に表示する 50000 レコードがあり、それをデータベースに保存したいのですが、SQL Server に挿入すると非常に遅くなります。

私のコード:

   For x As Integer = 0 To Me.DataGridView1.Rows.Count - 1
                With DataGridView1
                       Insert into tbl1 values("&.Rows(x).Cells(0).Value&", ......)
                End With
   Next

解決策はありますか?

4

1 に答える 1

1

多くのレコードを SQL Server のテーブルにすばやく挿入するには、SqlBulkCopyクラスを使用します。

まず、DataGridView の内容を DataTable にコピーする関数が必要です。

Private Function GetDataTable() As DataTable
    Dim DataTable1 As New DataTable

    Dim i1, i2, RowsCount1 As Integer

    For i1 = 0 To DataGridView1.Columns.Count - 1
        DataTable1.Columns.Add(DataGridView1.Columns(i1).Name, DataGridView1.Columns(i1).ValueType)
    Next

    If DataGridView1.AllowUserToAddRows = True Then
        RowsCount1 = DataGridView1.Rows.Count - 1
    Else
        RowsCount1 = DataGridView1.Rows.Count
    End If

    For i1 = 0 To RowsCount1 - 1
        DataTable1.Rows.Add(DataTable1.NewRow)

        For i2 = 0 To DataGridView1.Columns.Count - 1
            DataTable1.Rows(i1).Item(i2) = DataGridView1.Rows(i1).Cells(i2).Value
        Next
    Next

    Return DataTable1
End Function

この DataTable は、SqlBulkCopy クラスの WriteToServer メソッドを使用してデータベースに挿入されます。

次のコードは、提供された DataTable をデータベースに挿入します。

Private Sub SaveToDatabase(ByVal DataTable1 As DataTable)
    Dim ConnectionStr1 As String = "Server=ServerAddress;Database=DataBaseName;User Id=Username;Password=Password;"
    Dim SqlBulkCopy1 As New SqlClient.SqlBulkCopy(ConnectionStr1)

    SqlBulkCopy1.DestinationTableName = "TableName"

    SqlBulkCopy1.ColumnMappings.Add("SourceColumn1", "DestinationColumn1")
    SqlBulkCopy1.ColumnMappings.Add("SourceColumn2", "DestinationColumn2")
    SqlBulkCopy1.ColumnMappings.Add("SourceColumn3", "DestinationColumn3")
    '
    '

    SqlBulkCopy1.WriteToServer(DataTable1)
    SqlBulkCopy1.Close()
End Sub
于 2013-07-13T18:08:30.387 に答える