如何在SQLITE数据库中大容量插入?

8wigbo56  于 2022-11-15  发布在  SQLite
关注(0)|答案(3)|浏览(197)

我正在开发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 );
        }
    }
}

这段代码运行得很好,但是太慢了。
我想修改它,这样我就可以进行“大容量插入”。
我该怎么做?
THX

piah890a

piah890a1#

尝试使用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);
}
deyfvvtc

deyfvvtc2#

您应该在单个SQLLITE事务中插入所有20,000条记录。
大概是这样的:

using System.Data.SQLite;
...

public static void AddOrUpdateTickRecords(ObservableCollection<TickRecord> tickRecords)
{
    // Create a new connection
    using (var db = new SQLiteConnection(new SQLitePlatformWinRT(), DbPath))
    {
        //open transaction for rollback
        db.BeginTransaction();
        
        try
        {
            foreach (var tickRecord in tickRecords)
            {
                if (tickRecord.Id == 0)
                {
                    // New
                    db.Insert(tickRecord);
                }
                else
                {
                    // Update
                    db.Update(tickRecord);
                }
            }
            
            //send the data
            db.Commit();
        }
        catch (Exception)
        {
            //do rollback, if has some problem to insert
            db.Rollback();
        }
    }
}
lzfw57am

lzfw57am3#

我对Bibek Answer进行了一些修改,使其与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();
                }
            }
        }

相关问题