2016-06-02 3 views
2

Я хочу получать динамически выбранные строки с определенным диапазоном с OLE DB, тот код, который я написал:Импорт строк/партий из CSV с OleDB

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) 

он работает в цикле с максимальной и min и выбирает строки для шага и передает их другой функции, но проблема в том, что приведенный выше код действительно не работает, потому что он ищет идентификатор, но он должен действительно следить за строками. Я имею в виду, что есть 70 000 строк, но 200 000 идентификаторов. как я могу выбирать строки в oledb?

+0

Как может быть больше, чем Идентификаторы строк? – Plutonix

+0

, если я запустил код выше, он читается только до 60.000 идентификаторов, но не до последнего идентификатора, который равен 220 000, а всего 70 000 строк, некоторые идентификаторы являются избыточными и в этом порядке, например. 37, 37, 46, 126 – Sparkm4n

+0

В основном строки <> Id. Попытка ограничить количество строк, импортированных идентификатором, заставит его прочитать весь файл, чтобы посмотреть на идентификаторы. Мне нужно проверить, что что-то будет работать с текстовым драйвером – Plutonix

ответ

2

Фундаментально, Идентификаторы на самом деле не имеют никакого отношения к грести рассчитывать только случайно. Существует перегрузка для метода 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 Text Driver, так что вы можете указать типы данных, используемые для каждой строки. Без него текстовый драйвер определяет типы данных (догадки) из данных в первых нескольких строках.

Я должен упомянуть, что CSVHelper также может использоваться для загрузки строк партиями. Он считывает CSV-строку за раз, когда вы вызываете Read(), поэтому вам нужно всего лишь поддерживать ссылку на считыватель CSV и вызывать ее в цикле для получения N строк за раз.

DBDataAdapter.Fill on MSDN

3

Если я понимаю ваш вопрос, вы можете выбрать диапазон ячеек с помощью OLEDB, как показано ниже.

Select * from [Sheet1$A1:B10] 

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

+0

, на самом деле он должен возвращать все строки в определенном диапазоне, в sql я бы использовал 'select * from limit limit 0, 30', так что я получаю 30 строк – Sparkm4n