我正在创建一个将数据存储在SQLite后端的VB.Net应用程序。数据来自excel工作簿,用户可以从中导入。每个工作簿都有一个工作表(大约30,000行),可以稍微重新格式化并导入到新表中。最有效的方法是什么?
我目前正在从Excel到2D阵列的整个范围内阅读。循环遍历此数组中的行,并将每行添加到每千行执行一次的长SQL语句中。但是在循环遍历数组位和推送到SQLite步骤时,这是非常缓慢的。我不禁想到必须有一种更有效的方法来做到这一点。
谢谢,
以下代码: '首先打开xls重整器书并读入我们的数据 Dim xlApp As New Excel.Application Dim xlWorkBook As Excel.Workbook Dim xlWorkSheet As 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 :(得分:0)
导出为csv格式并使用批量加载。
答案 1 :(得分:0)
也许略微圆,但您可以将文件导入Access而不是Excel,然后导出到SQLite。
SQLite有一个ODBC驱动程序:
http://www.ch-werner.de/sqliteodbc/
使用它可以从Access导出到SQLite。这是从GUI执行此操作的示例。我的基本假设是可编程或可自动化(也许来自VBA)。
http://support.microsoft.com/kb/200427
我认为它会为您提供最少的格式化选项,但它应该是一种相当干净(并且立即)的方式。驱动程序是开源的,所以如果你精通C语言,你可以扩展它。