2017-12-20 6 views
1

Ich möchte Daten von SQL Server zu SQLite verschieben. Was ich tue, ist zuerst die Daten von SQL Server auf dataset zu verschieben und dann von dort in die SQLite-Tabelle zu verschieben.Einfügen von Daten von SQL Server zu SQLite

Folgendes ist der Code, der das tut. Ich glaube, es kann effizienter

try 
{ 
    using (SqlConnection sqlConnection = new SqlConnection(DataSources.RemoteConnectionString())) 
    { 
     sqlConnection.Open(); 

     using (SqlCommand sqlCommand = new SqlCommand("[DB7934_businessmind].[DownloadAreaOfLaw]", sqlConnection)) 
     { 
      sqlCommand.CommandType = CommandType.StoredProcedure; 
      sqlCommand.Parameters.AddWithValue("@AoLId", aolid); 

      SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); 
      sqlDataAdapter.SelectCommand = sqlCommand; 
      sqlDataAdapter.Fill(aolDataSet.TempAoL); 

      if (aolDataSet.TempAoL.Rows.Count > 0) 
      { 
       using (SQLiteConnection sqliteConnection = new SQLiteConnection(DataSources.LocalConnectionString())) 
       { 
        sqliteConnection.Open(); 

        using (SQLiteCommand sqliteCommand = new SQLiteCommand(sqliteConnection)) 
        { 
         foreach (Models.AoLDataSet.TempAoLRow r in aolDataSet.TempAoL.Rows) 
         { 
          sqliteCommand.CommandText = "INSERT INTO AreaOfLaw(AoLId, AreaOfLawTitle) VALUES(@AoLId, @AreaOfLawText)"; 
          sqliteCommand.Parameters.AddWithValue("@AoLId", r.AoLId); 
          sqliteCommand.Parameters.AddWithValue("AreaOfLawText", r.AreaOfLawTitle); 
          sqliteCommand.ExecuteNonQuery(); 
         } 

         sqliteCommand.Dispose(); 
        } 

        sqliteConnection.Close(); 
       } 
      } 
     } 

     sqlConnection.Close(); 
    } 
} 
catch (Exception ex) 
{ 
    MessageBox.Show("An error has occurred while downloading Areas Of Law from the cloud, the original error is: " + ex.Message, "Area Of Law", MessageBoxButtons.OK, MessageBoxIcon.Error); 
} 

Danke im Voraus

+0

Es gibt etwa 2000 Datensätze zum Download. Es dauert einige Sekunden, um von der SQL Server-Datenbank in das Dataset zu kopieren, aber dauert ungefähr 20 Minuten, um sie vom Dataset in die SQLite-Tabelle zu verschieben. – Bainn

+0

Sind die Tabellen mit der gleichen Struktur? Was ist der gespeicherte Prozedurcode? –

+0

Ja, die Tabellen haben die gleiche Struktur. Unten ist die gespeicherte Prozedur in SQL Server, die die Daten auswählt, die in das Dataset heruntergeladen werden. Wo kann ich den Code erneut hinzufügen? – Bainn

Antwort

0

Versuchen Sie, alle Einsätze in einer Transaktion Einwickeln:

try 
{ 
    using (SqlConnection sqlConnection = new SqlConnection(DataSources.RemoteConnectionString())) 
    { 
     sqlConnection.Open(); 
     using (SqlCommand sqlCommand = new SqlCommand("[DB7934_businessmind].[DownloadAreaOfLaw]", sqlConnection)) 
     { 
      sqlCommand.CommandType = CommandType.StoredProcedure; 
      sqlCommand.Parameters.AddWithValue("@AoLId", aolid); 
      SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); 
      sqlDataAdapter.SelectCommand = sqlCommand; 
      sqlDataAdapter.Fill(aolDataSet.TempAoL); 
      if (aolDataSet.TempAoL.Rows.Count > 0) 
      { 
       using (SQLiteConnection sqliteConnection = new SQLiteConnection(DataSources.LocalConnectionString())) 
       { 
        sqliteConnection.Open(); 

        using(SqliteTransaction tr = sqliteConnection.BeginTransaction()) 
        { 
         using (SQLiteCommand sqliteCommand = new SQLiteCommand(sqliteConnection)) 
         { 
          foreach (Models.AoLDataSet.TempAoLRow r in aolDataSet.TempAoL.Rows) 
          { 
           sqliteCommand.CommandText = "INSERT INTO AreaOfLaw(AoLId, AreaOfLawTitle) VALUES(@AoLId, @AreaOfLawText)"; 
           sqliteCommand.Parameters.AddWithValue("@AoLId", r.AoLId); 
           sqliteCommand.Parameters.AddWithValue("AreaOfLawText", r.AreaOfLawTitle); 
           sqliteCommand.ExecuteNonQuery(); 
          } 
          sqliteCommand.Dispose(); 
         } 

         tr.Commit(); 
        } 
        sqliteConnection.Close(); 
       } 
      } 
     } 
     sqlConnection.Close(); 
    } 
} 
catch (Exception ex) 
{ 
    MessageBox.Show("An error has occurred while downloading Areas Of Law from the cloud, the original error is: " + ex.Message, "Area Of Law", MessageBoxButtons.OK, MessageBoxIcon.Error); 
} 

Ich habe mit Einführungsgeschwindigkeit über die gleiche Frage kam mit sqlite und diese Technik löste das Problem - Einführungsgeschwindigkeit enorm erhöht. Ich weiß nicht, ob es noch andere Optionen gibt, um das Problem zu lösen, wenn dieses nicht passt.

+0

Warum sollte das die Leistung verbessern anstatt * eine Verzögerung zu verursachen? –

+0

@ Panagiotis Kanavos, weil sqlite unter expliziter Transaktion viel schneller einfügt. Viel schneller. Ich habe mich selbst damit beschäftigt und bin in die gleichen Schwierigkeiten geraten - es funktionierte viel zu langsam, nachdem ich alles in eine Transaktion eingepackt hatte, wurde es blitzschnell. – cookieMonster

+0

Erklären Sie es in der Antwort dann. Ich vermute auch, dass die Transaktion die Leistung verbessert, wenn Sie WAL verwenden. Trotzdem sind 20 Minuten für 2000 Platten viel zu langsam. –

Verwandte Themen