从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个。
答案 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