目前,我正在尝试使用此方法用数万个文本数据填充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倍。
答案 0 :(得分: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,请查看Robert Simpson撰写的this article(SQLite .NET提供程序的作者)答案 1 :(得分:0)
您必须自己处理数据转义,但您可以使用批量插入。
IE:
Insert Into Pages (ID, Data, Name) Values (...),(...),(...),(...)
答案 2 :(得分:0)
您可以将SQLite数据库中的表加载到DataTable - 对象中,然后将您的记录插入DataTable-Object,并将每5000条记录同步回数据库。