我想用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中选择行?
答案 0 :(得分:3)
如果我理解您的问题,您可以使用OLEDB选择单元格范围,如下所示。
Select * from [Sheet1$A1:B10]
答案 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行。