从数据表填充SQLite表的最快方法是什么

时间:2010-01-12 23:14:12

标签: c# sqlite

从C#.net 2中的DataTable填充SQLite数据库的最快方法是什么。

目前我正在为表格中的每一行构建插入语句。我尝试过dataadaptor,但速度似乎没有更快。目前需要5分钟才能遍历20,000行并将其写入数据库。 任何sugestions?

溶液:

我发现使用BEGIN ... COMMIT对插入物进行了大量修改后,我的速度得到了显着改善:

BEGIN;
INSERT INTO friends (name1,name2) VALUES  ('john','smith');
INSERT INTO friends (name1,name2) VALUES  ('jane','doe');
COMMIT;

我的插入语句大约每个500字节,因此我将每个事务的语句数量限制为100个。

3 个答案:

答案 0 :(得分:3)

请参阅SQLite网站上的此FAQ条目:

http://www.sqlite.org/faq.html#q19

默认情况下,每个INSERT语句都是自己的事务。但是如果用BEGIN ... COMMIT包围多个INSERT语句,则所有插入都被分组到一个事务中。提交事务所需的时间在所有随附的insert语句中分摊,因此每个insert语句的时间大大减少。

答案 1 :(得分:1)

请参阅this thread

最好的方法是使用ExecuteNonQuery(),它一次提交所有插入,而不必继续分配字符串。 20,000行应该花费不到一分钟。

答案 2 :(得分:0)

请考虑使用SqLiteDataAdapter。 (我仍然必须使用vb.net,但下面的示例应该易于翻译。或者查看原始来源:http://stackoverflow.com/a/2671511

Private Sub FillDatabaseTableWithDataTable(dataTable As DataTable)
            ' inspired by http://stackoverflow.com/a/2671511

            ' Query the destination database
            Dim query As String = $"SELECT * FROM `{dataTable.TableName}`"

            Using adapter As New SQLiteDataAdapter(query, Connection)

                Using commandBuilder = New SQLiteCommandBuilder(adapter)

                    Connection.Open()

                    commandBuilder.QuotePrefix = "["
                    commandBuilder.QuoteSuffix = "]"
                    commandBuilder.GetInsertCommand()

                    'Create an empty "destination" table for synchronization
                    ' with SqLite "source" database
                    Dim destinationTable As New DataTable()

                    'load data from SqLite "source" database to destination table, e.g.
                    'column headers
                    adapter.Fill(destinationTable)

                    'adapt "destination" table: fill data
                    For Each row As DataRow In dataTable.Rows
                        Dim destinationRow As DataRow = destinationTable.NewRow()
                        destinationRow.ItemArray = row.ItemArray
                        destinationTable.Rows.Add(destinationRow)
                    Next

                    'Update SqLite source table
                    'the Update has To be wrapped In a transaction
                    'Otherwise, SQLite would implicitly create a transaction
                    'for each line. That would slow down the writing process.
                    Using transaction = Connection.BeginTransaction()
                        adapter.Update(destinationTable)
                        transaction.Commit()
                    End Using

                    Connection.Close()
                End Using
            End Using
        End Sub