使用OleDB从CSV导入行/批次的范围

时间:2016-06-02 11:46:41

标签: .net vb.net oledb

我想用ole db获取具有特定范围的动态选定行,这就是我写的代码:

Dim ConStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & TextBox1.Text & ";Extended Properties=""TEXT;HDR=Yes;FMT=Delimited"""
        Dim conn As New OleDb.OleDbConnection(ConStr)
        Dim dt As New DataTable
            Try
            Dim CMD As String = "Select * from " & _table & ".csv WHERE ID BETWEEN " & min & "AND " & max
            Dim da As New OleDb.OleDbDataAdapter(CMD, conn)
            da.Fill(dt)

它在带有max和min的for循环中运行并逐步获取行并将它们传递给另一个函数,但问题是上面的代码确实没有用,因为它会查找ID但它实际上应该是照看行。我的意思是有70,000行但200,000个ID。如何在oledb中选择行?

2 个答案:

答案 0 :(得分:3)

如果我理解您的问题,您可以使用OLEDB选择单元格范围,如下所示。

Select * from [Sheet1$A1:B10]

https://support.microsoft.com/en-us/kb/316934

答案 1 :(得分:2)

从根本上说,除了偶然之外,Ids与行数没有任何关系。 DataAdapter.Fill()方法存在重载,您可以指定加载的行范围。我仔细检查以确保它适用于OleDB文本驱动程序。

Private OLECSVConnstr = ...your text driver connection string
Private firstRow As Int32 = 0
Private rowCount As Int32 = 1000
...
Private Function ImportRows(csvFile As String) As Int32

    Dim SQL = String.Format("SELECT * FROM {0}", csvFile)
    Dim rows As Int32

    Using dbcon As New OleDbConnection(OLECSVConnstr)
        Using cmd As New OleDbCommand(SQL, dbcon)

            ' DataTable is IDiposable, so dont just
            '   (re)create a new one each time
            If dtSample Is Nothing Then
                dtSample = New DataTable
            Else
                dtSample.Rows.Clear()
            End If

            Using da As New OleDbDataAdapter(cmd)
                dbcon.Open()
                rows = da.Fill(firstRow, rowCount, dtSample)
            End Using

            ' increment firstrow for next time
            firstRow += rowCount

        End Using
    End Using

    dgv2.DataSource = dtSample
    Return rows

End Function

修改:由于DataTable实施IDisposable,因此为每个“批次”/行集创建新的可能会导致泄漏。如果需要,上面检查并创建一个新的,否则清除行。或者,您只能创建一次DataAdapter。

DataAdapter.Fill(int first, int count, DataTable dt)允许您告诉适配器要加载的第一行和多少行。上面的ImportRows方法返回实际加载的行数,因此当它返回的数量少于请求的数量时,它应该意味着没有更多的行。

对于这么大的文件,我会使用Schema.INI和OleDB文本驱动程序,以便您可以指定用于每一行的数据类型。没有它,文本驱动程序将根据前几行中的数据确定数据类型(猜测)。

我应该提到CSVHelper也可以用来批量加载行。当您调用Read()时,它一次读取一行CSV,因此您需要做的就是保持对CSV读取器的引用并在循环中调用它以一次获得N行。

DBDataAdapter.Fill on MSDN