none
ACE12AccessDatabaseEngineを利用してExcelファイルに書き込む処理を高速にするには RRS feed

  • 質問

  • ASP.NETで開発しております。

    ACE12AccessDatabaseEngineを使用してDataTableに格納されているデータを
    Excelに書き込んでいます。
    書き込んだデータ量は30000行、横列100項目でファイルサイズがおよそ50MBになります。
    その際の処理時間は38分位かかっています。

    高速に処理を行う方法はないでしょうか?
    ご教授お願い致します。

    ソースコードについては以下になります。

    'カラム名の設定
    With sbSQL
        .Remove(0, .Length)
        .AppendLine("CREATE TABLE [Sheet1] ( ")

        For i = 0 To dataTable.Columns.Count - 1
            If i <> dataTable.Columns.Count - 1 Then
                If i <> dataTable.Columns.Count - 2 Then
                    .AppendLine(dataTable.Columns.Item(i).ColumnName & " " & "CHAR(255), ")
                Else
                    .AppendLine(dataTable.Columns.Item(i).ColumnName & " " & "CHAR(255) ")
                End If
            Else
                .AppendLine(") ")
            End If
        Next
    End With

    Using cmd As New OleDbCommand(sbSQL.ToString, con)
        cmd.ExecuteNonQuery()
    End Using


    'データの設定
    With sbSQL
        .Remove(0, .Length)
        .AppendLine("INSERT INTO [Sheet1] VALUES ( ")

        For i = 0 To dataTable.Columns.Count - 1
            If i <> dataTable.Columns.Count - 1 Then
                If i <> dataTable.Columns.Count - 2 Then
                    .AppendLine(dataTable.Columns.Item(i).ColumnName & ", ")
                Else
                    .AppendLine(dataTable.Columns.Item(i).ColumnName)
                End If
            Else
                .AppendLine(") ")
            End If
        Next
    End With


    '書き込み
    Using cmd As New OleDbCommand(sbSQL.ToString, con)
        For i = 0 To dataTable.Rows.Count - 1
            cmd.Parameters.Clear()
            For j = 0 To dataTable.Columns.Count - 1
                cmd.Parameters.Add(New OleDbParameter(dataTable.Columns.Item(j).ColumnName, dataTable.Rows(i).Item(j)))
            Next
            cmd.ExecuteNonQuery()
        Next
    End Using


    • 編集済み yukimai 2012年3月19日 5:33
    2012年3月14日 9:00

回答

  • 単純に cmd.Parameters.Clear()してAdd(new) を繰り返すのが遅いのではないでしょうか。

    各 Parameter の Value を更新しながら ExecuteNonQuery をしてみてはいかがでしょうか。


    Kazuhiko Kikuchi

    • 回答の候補に設定 山本春海 2012年3月23日 8:56
    • 回答としてマーク 山本春海 2012年4月5日 8:26
    2012年3月19日 6:43