0

在 WinRT (Win8) 中使用基于异步的 Web 服务和异步框架从远程 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     

         });
      }
    }


4

2 回答 2

1

您应该使用RunInTransactionsqlite -net。它的文档说,

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

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

GitHub 上交易的Wiki 文章

于 2013-11-06T13:11:32.973 回答
0

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

例如,请参阅此处以讨论使用不同方法的 SQLite 批量插入性能。

于 2013-11-06T12:46:18.547 回答