【问题标题】:What is the best approah to insert large records return from webservice in SQLite在 SQLite 中插入从 Web 服务返回的大记录的最佳方法是什么
【发布时间】:2026-01-22 03:00:01
【问题描述】:

在 WinRT (Win8) 中使用基于 Async 的 Webservice 和 Async 框架从远程 Ms SQL Server 获取大型记录集(1000 到 5000)。

我想知道:

1) 将大型记录集插入 SQLite 的最佳方法是什么?
2) 如果出现连接错误,使用 RollBack 事务将重新开始。下面的方法将插入任何内容,如果记录不完整,我可以稍后更新数据。这是一个好方法吗?
3) 有没有更好的方法来增强我的以下解决方案?

这个foreach语句要处理 每个从基于异步的 WebService 返回的结果中重新排序: foreach(IList 中的 WebServiceList _List) { InsertNewItems(_List.No,_List.Description,_List.Unit_Price,_List.Base_Unit_of_Measure); } 私人无效InsertNewItems(字符串ItemNo,字符串ItemName,十进制ItemPrice,字符串ItemBUoM) { var existingItem = (db2.Table().Where(c => c.No == ItemNo)).SingleOrDefault(); 如果(现有项目!= null) { 现有项目.No = 项目编号; 现有项目.描述 = 项目名称; 现有Item.Unit_Price = ItemPrice; 现有的Item.BaseUnitofMeasure = ItemBUoM; int 成功 = db2.Update(existingItem); } 别的 { int 成功 = db2.Insert(new Item() { 编号 = 项目编号, 描述 = 项目名称, Unit_Price = ItemPrice, Base_Unit_of_Measure = ItemBUoM }); } }

【问题讨论】:

    标签: sqlite windows-8 windows-runtime microsoft-metro winrt-xaml


    【解决方案1】:

    批量插入最重要的性能方面是使用单个事务。如果您想处理中止,我建议您以足够大的部分提供数据,并在下次从该点重新开始。 SQL 事务要么完全完成,要么完全回滚,因此除非输入数据在两次运行之间发生变化,否则不需要进行插入或更新。

    例如,请参阅here,了解有关使用不同方法的 SQLite 批量插入性能的讨论。

    【讨论】:

      【解决方案2】:

      您应该使用sqlite-net 中的RunInTransaction。它的文档说,

      通过包装在(可能是嵌套的)事务中执行操作 在一个保存点。如果发生异常,则滚动整个事务 返回,而不仅仅是当前的保存点。异常被重新抛出。

      using (var db = new SQLiteConnection(DbPath))
      {
          db.RunInTransaction(() =>
          {
              db.InsertOrReplace(MyObj);
          });
      }
      

      Wiki article 用于 GitHub 上的交易

      【讨论】:

      • 批量插入通常会禁用事务。
      • 一旦遇到错误,此语句 Using(var db=new SQLiteConnection()) 是否会停止 SQLite。我应该将 SQLite 声明为全局变量,以便即使遇到错误也可以继续运行它?
      最近更新 更多