当前位置:  开发笔记 > 编程语言 > 正文

如何离线存储大量数据,然后批量更新为SQLite数据库?

如何解决《如何离线存储大量数据,然后批量更新为SQLite数据库?》经验,为你挑选了1个好方法。

目前,我正在尝试使用此方法用数万个文本数据填充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倍.



1> Thomas Leves..:

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

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提供者的作者)

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有