0

我有一个 Excel 工作表和它的巨大.. 大约需要处理 200000 行。我所要做的就是阅读它并使用对 DB2 表的查询来处理它们。我编写了一个程序,其中处理 5000 行超过 8 小时。

有没有一种方法可以同时读取 excel 并执行查询。我希望他们独立于流程。我不能使用 Parallel.for 因为读取和创建这么多线程实例没有优势。任何管道和队列都是没有用的。这是一个 dom 方法,它不读取一行,它读取一个字符串。如果行上有一个空值,它执行该行并抛出一个空异常。我与后台工作人员和 TPL 相处得很好。任何想法或代码将不胜感激。除 OPENXML 外,任何 DLL 都不能使用

理想情况下,我不想添加到数组中,我希望它在 2 个差异变量中并在读取时处理它们。

  1. 读取一行(只有 2 列,忽略其他列
  2. 创建一个线程来执行该行并并行执行读取的行。
  3. 合并到一个表中。
  4. 显示结果..听起来很简单,但也有挑战。

.

Try
    Using spreadsheetDocument As SpreadsheetDocument =     spreadsheetDocument.Open(fileName, False)

        Dim workbookPart As WorkbookPart = spreadsheetDocument.WorkbookPart
        Dim worksheetPart As WorksheetPart = workbookPart.WorksheetParts.First()
        Dim sheetData As SheetData = worksheetPart.Worksheet.Elements(Of SheetData)().First()
        For Each r As Row In sheetData.Elements(Of Row)()
            For Each c As Cell In r.Elements(Of Cell)()
                Dim text As String
                Try
                    text = c.CellValue.Text.ToString
                    Debug.Print(text.ToString)
                    If text IsNot Nothing AndAlso Trim(text).Length > 0 Then
                        Arr.Add(text.ToString)
                    End If
                    text = Nothing
                    j += 1
                Catch
                End Try
            Next
            text = Nothing
        Next
    End Using
Catch ex As Exception
    MsgBox("Exception caught: " + ex.Message)
    Debug.Print(ex.Message.ToString)
    End
End Try
myArr = CType(Arr.ToArray(GetType(String)), String())

这是将数据划分为 2 个参数的过程

For i As Integer = 2 To myArr.Count - 1 Step 2
    If i And 1 Then
        i = i - 1
    Else
        dstr = DateTime.FromOADate(Double.Parse(myArr(i).ToString())).ToShortDateString()
        'Debug.Print(dstr.ToString & "----->" & i.ToString & "TCID--->" & myArr(i + 1).ToString)
        DQueue.Enqueue(DateTime.FromOADate(Double.Parse(myArr(i).ToString())).ToShortDateString())
        Tqueue.Enqueue((myArr(i + 1).ToString()))
        TCArr.Add((myArr(i + 1).ToString()))
        dc.Merge(ProcessQueryODBC(dstr, myArr(i + 1).ToString))

        If dc.Rows.Count > 0 Then
            dt.Merge(dc)
        Else
            nFound.Merge(CreateDT(dstr, myArr(i + 1).ToString()))
        End If
    End If
Next
4

1 回答 1

0

而不是通过 ODBC 打开数据库连接。能否将数据导出到 CSV 文件,然后让 DB2 执行导入

somestring = "import from "myfile.csv" of DEL ...."
DoCmd.RunSQL somestring 
于 2014-03-25T22:44:20.150 回答