3

目前,我正在尝试使用这种方法用数以万计的文本数据填充 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超级重要:确保在 a - 在这种情况下为a 执行所有 SQL 命令SQLiteTransaction

SQLiteTransaction trans = connection.BeginTransaction();

// SQL centric code - repeated inserts/changes

trans.Commit(); // adds your changes

它将性能提高了 1000 倍。

4

3 回答 3

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 注入的风险

顺便说一句,看看Robert Simpson 的这篇文章(SQLite .NET 提供程序的作者)

于 2009-08-22T16:17:35.417 回答
0

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

IE:

Insert Into Pages (ID, Data, Name) Values (...),(...),(...),(...)
于 2009-08-22T16:05:07.457 回答
0

您可以将 SQLite DB 中的表加载到DataTable -Object 中,然后将记录插入 DataTable-Object 并将每 5000 条记录同步回 DB。

于 2009-08-23T10:38:10.287 回答