目前,我正在尝试使用此方法用数万个文本数据填充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条记录添加到数据库中(所以它更快)?
编辑:超级重要:确保在一个内部执行所有SQL命令DbTransaction
- 在这种情况下SQLiteTransaction
:
SQLiteTransaction trans = connection.BeginTransaction(); // SQL centric code - repeated inserts/changes trans.Commit(); // adds your changes
它将性能提高了1000倍.
使用参数化查询,而不是使用字符串连接构建查询:
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注入的风险
顺便说一句,看看Robert Simpson撰写的这篇文章(SQLite .NET提供者的作者)