2009-08-22 27 views
3

目前,我试图填补数以千使用这种这种方法数千文本数据的SQLite数据库:如何离线存储大量数据,然后将其批量更新到SQLite数据库中?

SQLiteConnection = new SQLiteConnection(cntnStr); 
connection.Open(); 

foreach(Page p in pages) 
{ 
    using (SQLiteCommand command = new SQLiteCommand(String.Format("Insert Into Pages (ID, Data, Name) Values ({0}, '{1}', '{2}')", id, p.Data, p.Name), connection)) 
     command.ExecuteNonQuery(); 
} 

不过,我怀疑,这样做每秒约10次的可能拖慢整个过程。有没有一种方法可以整理内存中的数据,然后每批添加5000条记录到数据库中(所以速度更快)?

编辑:超级重要:请确保您执行DbTransaction内所有的SQL命令 - 在这种情况下,SQLiteTransaction

SQLiteTransaction trans = connection.BeginTransaction(); 

// SQL centric code - repeated inserts/changes 

trans.Commit(); // adds your changes 

它通过1000倍的提高性能。

回答

6

使用参数化查询,而不是使用字符串连接构建查询:

using (SQLiteConnection = new SQLiteConnection(cntnStr)) 
{ 
    connection.Open(); 

    string query = "Insert Into Pages (ID, Data, Name) Values (?, ?, ?)"; 
    using (SQLiteCommand command = new SQLiteCommand(query, connection) 
    { 
     command.Parameters.Add("id", DbType.Int32); 
     command.Parameters.Add("data", DbType.String); 
     command.Parameters.Add("name", DbType.String); 
     foreach(Page p in pages) 
     { 
      command.Parameters["id"].Value = p.Id; 
      command.Parameters["data"].Value = p.Data; 
      command.Parameters["name"].Value = p.Name; 
      command.ExecuteNonQuery(); 
     } 
    } 
} 

这将是更快,因为的DbCommand只创建一次,并且查询是只解析一次。此外,您避免SQL注入的风险,由于字符串连接

BTW,看看this article罗伯特·辛普森(SQLite的.NET提供程序的作者)

+0

你能帮我解决吗? – 2009-08-22 16:18:18

+0

啊,我在这里找到了答案:http://codebetter.com/blogs/david.hayden/archive/2006/01/05/136264.aspx – 2009-08-22 16:21:14

+0

查看我的更新回答 – 2009-08-22 16:27:52

0

您必须自己处理转义数据,但可以使用批量插入。

IE:

Insert Into Pages (ID, Data, Name) Values (...),(...),(...),(...) 
+0

即使使用StringBuilder,这也需要大量的字符串操作。有另一种方法吗? – 2009-08-22 16:10:21

0

你可以从SQLite的DB装载表放入DataTable -Object,然后将您的记录插入到DataTable-Object中,并将每5000条记录同步回数据库。

相关问题