【问题标题】:How to bulk insert into SQLITE database?如何批量插入 SQLITE 数据库?
【发布时间】:2016-04-21 19:01:19
【问题描述】:

我正在开发 UWP 应用程序。

我有一个应该用大约 20,000 条记录初始化的数据库。记录,定义如下:

private static readonly ObservableCollection<TickRecord> TickRecords = new ObservableCollection<TickRecord>();

我尝试像这样一次插入一条记录:

private void CreateFakeTickRecords()
{
if ( Database.Database.CountTickRecords() > 0 )
    {
    return;
    }

foreach ( var tickRecord in TickRecords )
    {
    Database.Database.AddOrUpdateTickRecord( tickRecord );
    }
}

public static void AddOrUpdateTickRecord( TickRecord tickRecord )
{
    // Create a new connection
    using ( var db = new SQLiteConnection( new SQLitePlatformWinRT(), DbPath ) )
    {
    if ( tickRecord.Id == 0 )
        {
        // New
        db.Insert( tickRecord );
        }
    else
        {
        // Update
        db.Update( tickRecord );
        }
    }
}

这段代码运行良好,但是速度太慢了。

我想修改它,以便进行“批量插入”。

我该怎么做?

谢谢

【问题讨论】:

  • 你不能只将带有初始数据集的 db 文件添加到应用程序包中,然后在首次使用时将其复制到存储中吗?

标签: c# sqlite win-universal-app


【解决方案1】:

试试 InsertAll 和 UpdateAll 函数。希望这只会打开一次数据库表并立即插入/更新所有内容。您需要提前确定要插入/更新哪些对象,但这仍然应该会加快速度。

List<TickRecords> updates = new List<TickRecords>(); 

List<TickRecords> inserts = new List<TickRecords>();  

foreach ( var tickRecord in tickRecords ) 
{   
    if ( tickRecord.Id == 0 )
    {       
        updates.Add(tickRecord);
    }
    else
    {       
        inserts.Add(tickRecords);
     } 
}



using ( var db = new SQLiteConnection( new SQLitePlatformWinRT(), DbPath ) ) 
{
     db.InsertAll(inserts);
     db.UpdateAll(updates);
}

【讨论】:

    【解决方案2】:

    您应该在单个 sqllite 事务中插入所有 20K 记录。

    类似这样的:

        public static void AddOrUpdateTickRecords( ObservableCollection<TickRecord> tickRecords )
            {
            // Create a new connection
            using ( var db = new SQLiteConnection( new SQLitePlatformWinRT(), DbPath ) )
                {
                db.BeginTransaction();
                try
                    {
                    foreach ( var tickRecord in tickRecords )
                        {
                        if ( tickRecord.Id == 0 )
                            {
                            // New
                            db.Insert( tickRecord );
                            }
                        else
                            {
                            // Update
                            db.Update( tickRecord );
                            }
                        }
    
                    db.Commit();
                    }
                catch ( Exception )
                    {
                    db.Rollback();
                    }
                }
            }
    

    【讨论】:

    • 感谢您的回答。 db.BeginTransaction 在 SQLITE 的 UWP 实现中返回 void。
    • 优秀。谢谢你。在事务之前,插入 300K 记录需要 5 分钟。现在只用了3秒。大声笑..惊讶.. !!!
    【解决方案3】:

    我稍微修改了 Bibek 答案以使其与 UWP 匹配:

            public static void AddOrUpdateTickRecords( ObservableCollection<TickRecord> tickRecords )
            {
            // Create a new connection
            using ( var db = new SQLiteConnection( new SQLitePlatformWinRT(), DbPath ) )
                {
                db.BeginTransaction();
                try
                    {
                    foreach ( var tickRecord in tickRecords )
                        {
                        if ( tickRecord.Id == 0 )
                            {
                            // New
                            db.Insert( tickRecord );
                            }
                        else
                            {
                            // Update
                            db.Update( tickRecord );
                            }
                        }
    
                    db.Commit();
                    }
                catch ( Exception ex )
                    {
                    db.Rollback();
                    }
                }
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多