0

WinRT (Win8) で非同期ベースの Web サービスと非同期フレームワークを使用して、リモートの Ms SQL Server から大きなレコードセット (1000 から 5000) を取得します。

私は知りたいです :

1) SQLite に大きなレコードセットを挿入するための最良の方法はどれですか?
2) 接続エラーが発生した場合、RollBack トランザクションを使用すると最初からやり直しになります。以下のメソッドは何でも挿入し、レコードが完全でない場合は後でデータを更新できます。これは良いアプローチですか?
3)以下のソリューションを強化するためのより良い方法はありますか?

処理するこの foreach ステートメント
Async-Based WebService から返された返された結果の各レコード:

foreach (IList の WebServiceList _List)
   {      

     InsertNewItems(_List.No, _List.Description, _List.Unit_Price, _List.Base_Unit_of_Measure);

   }


 private void InsertNewItems(string ItemNo, string ItemName, decimal ItemPrice, string ItemBUoM)
 {

    var existingItem = (db2.Table().Where(c => c.No == ItemNo)).SingleOrDefault();

    if (既存のアイテム != null)
    {
      existingItem.No = ItemNo;
      existingItem.Description = アイテム名;
      existingItem.Unit_Price = ItemPrice;
      existingItem.BaseUnitofMeasure = ItemBUoM;

      int 成功 = db2.Update(existingItem);

      }
      そうしないと
      {
        int 成功 = db2.Insert(新しいアイテム()
         {
           いいえ = アイテム番号、                          
           説明 = アイテム名、
           Unit_Price = アイテム価格、                       
           Base_Unit_of_Measure = ItemBUoM     

         });
      }
    }


4

2 に答える 2

1

sqlite-netRunInTransactionから使用する必要があります。それに関するドキュメントには、

SAVEPOINT でラップすることにより、(ネストされている可能性がある) トランザクション内でアクションを実行します。例外が発生すると、現在のセーブポイントだけでなく、トランザクション全体がロールバックされます。例外が再スローされます。

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

GitHub でのトランザクションに関するWiki 記事

于 2013-11-06T13:11:32.973 に答える
0

一括挿入の最も重要なパフォーマンスの側面は、単一のトランザクションを使用することです。アボートを処理したい場合は、データを十分に大きな部分に分けてフィードし、次回からその時点から再起動することをお勧めします。SQL トランザクションは完全に終了するか完全にロールバックするため、2 回の実行間で入力データが変更されない限り、挿入または更新を行う必要はありません。

たとえば、さまざまな方法を使用した SQLite 一括挿入のパフォーマンスについては、こちらを参照してください。

于 2013-11-06T12:46:18.547 に答える