2010-12-28 22 views
5

Estoy usando C# /. NET con el contenedor C# para SQLite. Estoy intentando fusionar dos bases de datos SQLite al tiempo que excluyo los duplicados.Fusionando dos archivos de base de datos SQLite (C# .NET)

Encontré esto, que se hace referencia a partir de algunas preguntas de foro diferentes. http://old.nabble.com/Attempting-to-merge-large-databases-td18131366.html

He intentado las siguientes consultas, que he estructurado a partir del enlace que proporcioné, pero dan como resultado excepciones, las bases de datos no se fusionan y la base de datos original no se modifica en absoluto.

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

Aquí está mi código de consulta.

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

Mi pregunta es, ¿qué estoy haciendo mal? ¿Y alguien está familiarizado con el comando Insertar? No estoy seguro si excluirá duplicados cuando lo necesite.

Respuesta

7

Cuando adjunte una base de datos en SQLite, debe ejecutar cada instrucción (ya sea insertar, actualizar, eliminar) en una sola Conexión/Transacción. No cierre la conexión en el medio. Debe completar en una sola transacción.

probar esto

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

Gran! Eso funcionó, pero no elimina los duplicados. ¿Tienes algún consejo sobre cómo manejar eso? ¿Hay otro comando que pueda usar además de insertar? De nuevo, gracias por tu ayuda. – CODe

+6

para evitar duplicados, puede comparar dos tablas como. {SQL = "INSERT INTO SUBCONTRACTOR SELECT * FROM TOMERGE.SUBCONTRACTOR WHERE [YOUR_UNIQUE_ID] NOT IN (SELECCIONE [YOUR_UNIQUE_ID] FROM SUBCONTRACTOR)} – Binil