2010-12-28 2 views
5

Używam C#/.NET z opakowaniem C# dla SQLite. Próbuję scalić dwie bazy danych SQLite jednocześnie wykluczając duplikaty.Scalanie dwóch plików bazy danych SQLite (C# .NET)

Znalazłem to, o czym mowa w kilku różnych pytaniach na forum. http://old.nabble.com/Attempting-to-merge-large-databases-td18131366.html

Próbowałem wypróbować poniższe zapytania, które zostały uporządkowane na podstawie podanego linku, ale powodują wyjątki, bazy danych nie są w ogóle łączone, a oryginalna baza danych nie jest w żaden sposób zmieniana.

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

Oto mój kod zapytania.

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(); 
     } 
    } 

Moje pytanie brzmi: co robię źle? A czy ktoś jest zaznajomiony z poleceniem wstawiania? Nie jestem pewien, czy wykluczy duplikaty, jakie będę potrzebować.

Odpowiedz

7

Po dołączeniu bazy danych do SQLite, należy wykonać każdą instrukcję (wstawianie, aktualizowanie, usuwanie) w pojedynczym połączeniu/transakcji. Nie zamykaj połączenia pomiędzy. Powinien zakończyć się w pojedynczej Transakcji.

spróbować tej

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

Great! To zadziałało, ale nie usuwa duplikatów. Czy masz jakieś porady, jak sobie z tym poradzić? Czy istnieje inne polecenie, które mogę użyć oprócz wstawienia? Jeszcze raz dziękuję za pomoc. – CODe

+6

, aby uniknąć duplikatów, można porównać dwie tabele, takie jak. {SQL = "WSTAW NA WYBÓR SUBKONTAKTORA * OD TOMERGE.SUBCONTRACTOR GDZIE [YOUR_UNIQUE_ID] NIE JEST (WYBIERZ [YOUR_UNIQUE_ID] OD PODWYKONAWCY)} – Binil