0

現在、Excelで大量のデータを処理しており、データ型が混在するVB.NetのDataTable(30列あたり70,000行)にアップロードしたいと考えています。

次のコードを使用して情報をインポートしています。

Public Function mc_ExcelTableToDataTable(ByRef ExcelApp As Excel.Application, _
                                          ByVal SheetName As String, _
                                          ByVal TableName As String, _
                                          Optional ByVal FilePath As String = "", _
                                          Optional ByVal SQLsentence As String = "") As DataTable


        Dim vPath As String
        Dim vCloseExcelWorkbook As Boolean = False

        If ExcelApp.ActiveWorkbook IsNot Nothing Then
            vPath = IIf(FilePath = "", ExcelApp.ActiveWorkbook.FullName, FilePath)
        Else
            vPath = FilePath
        End If

        If SQLsentence = "" And ExcelApp.ActiveWorkbook Is Nothing Then
            vCloseExcelWorkbook = True
            ExcelApp.Workbooks.Open(vPath)
        End If

        Dim vRange As String = ExcelApp.Sheets(SheetName).ListObjects(TableName).Range.AddressLocal

        vRange = vRange.Replace("$", "")

        Dim vCNNstring As String = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                                    "Data Source= " & vPath & ";" & _
                                    "Extended Properties=""Excel 8.0;HDR=YES;IMEX=1"""

        Dim ExcelCNN As System.Data.OleDb.OleDbConnection = New System.Data.OleDb.OleDbConnection(vCNNstring)

        Dim vSQL As String = IIf(SQLsentence = "", _
                                 "SELECT * FROM [" + SheetName + "$" & vRange & "]", _
                                 SQLsentence)

        Dim ExcelCMD As System.Data.OleDb.OleDbDataAdapter = New System.Data.OleDb.OleDbDataAdapter(vSQL, ExcelCNN)

        ExcelCNN.Open()
        Dim ExcelDS As System.Data.DataSet = New DataSet
        ExcelCMD.Fill(ExcelDS)

        mc_ExcelTableToDataTable = ExcelDS.Tables(0).Copy

        ExcelCMD = Nothing
        ExcelCNN.Close()

        ExcelDS.mc_Dispose()

        If vCloseExcelWorkbook Then ExcelApp.ActiveWorkbook.Close(False)

        GCcleaner()
    End Function

しかし、VB.Netは私に次のエラーを与えます:

エラー

プロバイダーACE.OLEDB.12.0の最大容量を知っている人はいますか?または、この問題をどのように修正しますか?

参考までに、これはSQL選択文です。

SELECT * FROM [Workflow data$A1:AC70276]

行を20000(SELECT * FROM [Workflow data $ A1:AC20000])に制限すると、プロセスは正常に機能することに注意してください。

4

2 に答える 2

0

うーん....場合によっては、ACE.OLEDB.12.0ドライバーに古いアーティファクトスタイルのバグがあり、60000行を超えるExcelスプレッドシートへのクエリでこのような奇妙なエラーが発生する可能性があると聞いています。 。そして私はこれを自分で証明することはできませんが、範囲サイズを古いExcelの古い65536行の制限に変更した場合、またはエラーが発生した場合は+/- 5%と言った場合、どうなるのか疑問に思います。どこかに行って。あなたが20000行でそれを試したのは特に不思議で、それは明らかにうまくいきました。

編集私はこのシナリオをテストするためにいくつかの同等のC#コードをまとめましたが、このサイズに近づくクエリが「システムリソースを超えました」から「OutOfMemoryExceptions」までの範囲の一貫性のないエラーを作成していることを提供することしかできません。あなたの正確なエラーを見たとは言えませんが、この動作はインポートプロセスに負担をかけ始めており、予測できない動作ではないにしても望ましくない動作が発生する可能性があります。可能であれば、データを小さなチャンクに分割することをお勧めします。

幸運を。

于 2012-09-17T01:09:29.873 に答える
0

問題の解決策を見つけたようです。

基本的に範囲を削除しました。私が使用した現在選択されている文では:

SELECT * FROM [Workflow data$A1:AC70276]

私はそれを次の文に置き換えました:

SELECT * FROM [Workflow data$]
于 2012-09-20T03:19:07.720 に答える