2012-02-10 3 views
0

Я создаю приложение VB.Net, которое хранит данные в бэкэнд SQLite. Данные поступают в Excel-книги, которые пользователь может импортировать. Каждая рабочая книга имеет один рабочий лист (около 30 000 строк), который немного переформируется и импортируется в новую таблицу. Каков наиболее эффективный способ сделать это?Эффективный способ импорта данных Excel в SQLite db в VB.Net

Я сейчас читаю во всем диапазоне от Excel в 2D-массив. Зацикливание по строкам в этом массиве и добавление каждой строки в длинный SQL-оператор, который выполняется каждые тысячи строк. Но это очень медленно, как при циклическом переходе через бит массива, так и при нажатии на шаг SQLite. Я не могу не думать, что должно быть более эффективное средство для этого.

Спасибо,

код ниже: «Сначала откройте XLS reformater книгу и прочитать в наших данных Dim xlApp Как Новый Excel.Application Dim xlWorkBook Как Excel.Workbook Dim xlWorkSheet Как Excel.Worksheet

xlWorkBook = xlApp.Workbooks.Open(strFile) 
    xlWorkSheet = xlWorkBook.Worksheets("ToDSS") 

    Dim r As Excel.Range = xlWorkSheet.UsedRange 
    Dim array(,) As Object = r.Value(Excel.XlRangeValueDataType.xlRangeValueDefault) 

    xlWorkBook.Close() 
    xlApp.Quit() 

    releaseObject(xlApp) 
    releaseObject(xlWorkBook) 
    releaseObject(xlWorkSheet) 

    SQLconnect.Open() 
    SQLcommand = SQLconnect.CreateCommand 

    'now loop through the rows inserting each into the db 

    Dim curDate As Date 

    strSQL = "" 
    Dim batch As Integer = 0 

    For row As Integer = 16 To array.GetUpperBound(0) 
     strSQL += "INSERT INTO scenario_" & strScenarioName & " VALUES ('" 
     curDate = array(row, 1) 
     strSQL += curDate.ToString("yyyy'-'MM'-'dd") + "'" 

     For col = 2 To 30 
      strSQL += ", " & array(row, col) 

     Next 
     strSQL += ");" & vbCrLf 

     If batch > 1000 Or row = array.GetUpperBound(0) Then 
      Debug.Print(Str(row)) 
      SQLcommand.CommandText = strSQL 
      SQLcommand.ExecuteNonQuery() 
      Debug.Print("pushed") 
      strSQL = "" 
      batch = 0 
     Else 
      batch += 1 
     End If 

    Next 
    SQLcommand.Dispose() 
    SQLconnect.Close() 

ответ

0

Экспортировать в формате csv и использовать массовую загрузку.

+0

Это может сработать. Я не знаком с массовой загрузкой и не могу найти ссылки на нее относительно sqlite и VB.Net Спасибо –

+0

См. Http://stackoverflow.com/questions/928873/how-do-i-bulk-insert -with-sqlite – Chriseyre2000

0

Возможно, немного вокруг, но вы можете импортировать свой файл в Access вместо Excel и затем экспортировать в SQLite.

Там есть драйвер ODBC для SQLite:

http://www.ch-werner.de/sqliteodbc/

С помощью этого вы можете экспортировать от доступа к SQLite. Вот пример того, как это сделать из графического интерфейса. Мое предположение основано на том, что это программируется или может быть автоматизировано (возможно, из VBA).

http://support.microsoft.com/kb/200427

Я предполагаю, что это даст вам минимальные параметры форматирования, но оно должно быть достаточно чистый (и непосредственным) способом сделать это. Водитель с открытым исходным кодом, поэтому вы можете расширить его, если вы достаточно владеете C. C.

+0

Это то, что конечный пользователь должен будет делать, поскольку данные изначально в формате excel. Пройти через доступ сначала было бы немного боли. –

+0

К сожалению, я не смог найти более простой способ, чем это сам. Единственное, что я еще не сделал, - это попытаться автоматизировать его. Там, где я работаю, у нас есть CAD-моделисты, которые делают много дампов данных для доступа, поскольку это то, что, по-видимому, знает отрасль. Данные заканчиваются тем, что обращаются к Oracle в один раунд. Это довольно большой беспорядок вокруг. – Max

+0

Я закодировал веб-приложение .NET для импорта таблиц Excel в базу данных SQL, а затем код будет взаимодействовать с базой данных SQLite, чтобы выталкивать данные взад и вперед, но есть серьезные проблемы с возвратами каретки в ячейках Excel. Веб-сервисы вычеркивают CRLF в обмен на только LF. Excel любит переносить каждый LF в новую ячейку, поэтому было немного сложно заставить ее работать. Особенно для ячейки требуется LF в конце записи. – htm11h

Смежные вопросы