在VB.Net中将Excel数据导入SQLite数据库的有效方法

时间:2012-02-10 22:35:33

标签: vb.net sqlite

我正在创建一个将数据存储在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()

2 个答案:

答案 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语言,你可以扩展它。