2010-12-28 8 views
5

SQLiteのC#ラッパーでC#/ .NETを使用しています。私は2つのSQLiteデータベースを併合しようとしていますが、重複は除きます。2つのSQLiteデータベースファイル(C#.NET)をマージする

これは、いくつかの異なるフォーラムの質問から参照されています。 http://old.nabble.com/Attempting-to-merge-large-databases-td18131366.html

私が提供したリンクから構成した以下のクエリを試しましたが、例外が発生しました。データベースはまったくマージされず、元のデータベースはまったく変更されません。

attach 'c:\test\b.db3' as toMerge; 
insert into AuditRecords select * from toMerge.AuditRecords; 

ここに私の照会コードがあります。

public void importData(String fileLoc) 
    { 
     SQLiteTransaction trans; 
     string SQL = "ATTACH '" + fileLoc + "' AS TOMERGE"; 
     SQLiteCommand cmd = new SQLiteCommand(SQL); 
     cmd.Connection = connection; 
     connection.Open(); 
     trans = connection.BeginTransaction(); 
     int retval = 0; 
     try 
     { 
      retval = cmd.ExecuteNonQuery(); 
     } 
     catch (Exception) 
     { 
      trans.Rollback(); 
      MessageBox.Show("An error occurred, your import was not completed."); 
     } 
     finally 
     { 
      trans.Commit(); 
      cmd.Dispose(); 
      connection.Close(); 
     } 

     SQL = "INSERT INTO SUBCONTRACTOR SELECT * FROM TOMERGE.SUBCONTRACTOR"; 
     cmd = new SQLiteCommand(SQL); 
     cmd.Connection = connection; 
     connection.Open(); 
     trans = connection.BeginTransaction(); 
     retval = 0; 
     try 
     { 
      retval = cmd.ExecuteNonQuery(); 
     } 
     catch (Exception) 
     { 
      trans.Rollback(); 
      MessageBox.Show("An error occurred, your import was not completed."); 
     } 
     finally 
     { 
      trans.Commit(); 
      cmd.Dispose(); 
      connection.Close(); 
     } 
    } 

私の質問は間違っていますか?そして、insertコマンドに精通している人はいますか?私はそれが必要な重複を除外するかどうかは分かりません。

答えて

7

SQLiteでデータベースをアタッチするときは、すべての文(挿入、更新、削除)を1つのConnection/Transactionで実行する必要があります。間に接続を終了しないでください。単一のトランザクションで完了する必要があります。

この

public void importData(String fileLoc) 
     { 
      string SQL = "ATTACH '" + fileLoc + "' AS TOMERGE"; 
      SQLiteCommand cmd = new SQLiteCommand(SQL); 
      cmd.Connection = connection; 
      connection.Open(); 
      int retval = 0; 
      try 
      { 
       retval = cmd.ExecuteNonQuery(); 
      } 
      catch (Exception) 
      { 
       MessageBox.Show("An error occurred, your import was not completed."); 
      } 
      finally 
      { 
       cmd.Dispose(); 
      } 

      SQL = "INSERT INTO SUBCONTRACTOR SELECT * FROM TOMERGE.SUBCONTRACTOR"; 
      cmd = new SQLiteCommand(SQL); 
      cmd.Connection = connection; 
      retval = 0; 
      try 
      { 
       retval = cmd.ExecuteNonQuery(); 
      } 
      catch (Exception) 
      { 
       MessageBox.Show("An error occurred, your import was not completed."); 
      } 
      finally 
      { 
       cmd.Dispose(); 
       connection.Close(); 
      } 
     } 
+0

グレートを試してみてください!それは機能しましたが、重複は削除されません。それをどう扱うべきかアドバイスはありますか?挿入以外に使用できるコマンドがありますか?あなたの助けをもう一度ありがとう。重複を避けるために – CODe

+6

、あなたは2つのテーブルを比較することができます。 {SQL = "SUBCONTRACTOR SELECT *をTOMERGE.SUBCONTRACTORから挿入してください([YOUR_UNIQUE_ID]が入っていない([YOUR_UNIQUE_ID]を子孫から選択する)} – Binil

関連する問題