2012-02-10 76 views
0

我创建了一个将数据存储在SQLite后端的VB.Net应用程序。数据出现在用户可以从中导入的excel工作簿中。每个工作簿都有一个工作表(约30,000行),可以重新格式化并导入到新表中。什么是最有效的方式来做到这一点?将Excel数据导入VB.Net中的SQLite数据库的高效方法

我目前正在阅读从Excel到整个范围的二维数组。遍历该数组中的行并将每行添加到每千行执行一个较长的SQL语句。但是,在循环数组位和推入SQLite步骤时,这是非常缓慢的。我不禁想到,必须有一个更有效的方法来做到这一点。

谢谢,下面

代码: “首先打开XLS reformater书,在我们的数据 昏暗xlApp作为新Excel.Application 昏暗xlWorkBook作为Excel.Workbook 昏暗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相关的任何引用。 谢谢 – 2012-02-10 23:17:28

+0

请参阅http://stackoverflow.com/questions/928873/how-do-i-bulk-insert -with-sqlite – Chriseyre2000 2012-02-11 10:59:15

0

也许稍微有些变化,但是您可以将文件导入Access而不是Excel,然后导出到SQLite。

有一个ODBC驱动程序的SQLite:

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

使用,你可以从Access导出到SQLite的。这里是一个从GUI上做的例子。我的基本假设是这是可编程的,或者可以自动化(也许来自VBA)。

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

我相信它会给你最少的格式选择,但它应该是做的相当干净(和即时)的方式。这个驱动程序是开源的,所以如果你足够精通C语言,你就可以扩展它。

+0

这是最终用户需要做的事情,因为数据本身是以excel格式存在的。首先通过访问会有点痛苦。 – 2012-02-10 23:14:39

+0

不幸的是,我一直无法找到比这更简单的方法。我还没有完成的唯一的事情是尝试自动化它。在我工作的地方,我们有CAD建模人员,他们会进行大量的数据转储,因为这是业界知道的。数据最终将围绕时尚转向甲骨文。这是一个相当大的混乱。 – Max 2012-02-13 19:21:31

+0

我已经编写了一个.Net网络应用程序来将Excel电子表格导入到SQL数据库,然后代码将与SQLite数据库进行交互以将数据来回推送,但Excel单元格中的回车存在主要问题。 Web服务将CRLF剥离为换取LF。 Excel喜欢将每个LF移植到一个新的单元中,所以让它工作起来有点棘手。尤其是单元格在记录末尾需要一个LF。 – htm11h 2018-01-04 16:16:07

相关问题