ich habe in einem bestehenden Projekt ein kleines Problem. Ich habe knapp 35k Datensätze die es in eine SQL CE Datenbank zu packen gilt.
Großes Problem: Die Dauer.
Je nach Funktionen die ich einbaue, dauert der INSERT über eine Stunde.
Ich weiß, dass bei dem MS SQL Bulk Copy das ganze nur wenige Sekunden bis max. 2 Minuten dauert. Je nach dem wie ausgelastet mein Rechner ist und wie gerade im Netz verkehrt wird.
An und für sich ist das für mich Privat kein Problem. Da aber bereits mehrere Bekannte interesse angemeldet haben, möchte ich nicht, dass die Stundenlang mit der Ersteinrichtung zu tun haben.
Komplette Projekte aus Codeproject möchte ich nicht übernehmen - da gibt es bereits eine Bulkcopy Klasse für SQL CE.
Was ich wissen möchte ist, ob sich das Ganze etwas verkürzen lässt. 10 Minuten würde ich noch hinnehmen, auch als absolute Laie, da ich in dem Moment ja nicht wissen würde, was da hinter steht.
Wenn ich z.B. die Funktion raus nehme, dass bei Windows 7 der Installationsfortschritt in der Taskleiste angezeigt wird, geht es ca. 5 Minuten schneller. Aber ich weiß nicht, warum das so ist - jedenfalls versteh ich es nicht so recht.
Der Aufruf:
private void bgwCreateRows_DoWork(object sender, DoWorkEventArgs e) { foreach (string strGetRows in clsCreateDB.createDatabaseRows()) { while (strGetRows != "") { SqlCeConnection conGetRows = new SqlCeConnection("Data Source = " + Application.StartupPath + "\\Database\\MyFinance.sdf"); conGetRows.Open(); SqlCeCommand cmdGetRows = new SqlCeCommand(strGetRows, conGetRows); cmdGetRows.ExecuteNonQuery(); bgwCreateRows.ReportProgress(counter++); int i = clsCreateDB.createDatabaseRows().Count; tm.SetProgressState(TaskbarProgressBarState.Normal); tm.SetProgressValue(counter,i); if (counter == 1) { Properties.Settings.Default.dStart = DateTime.Now; Properties.Settings.Default.Save(); } else if (counter == pbRows.Maximum) { Properties.Settings.Default.dEnd = DateTime.Now; Properties.Settings.Default.Save(); } conGetRows.Close(); TimeSpan ts = Properties.Settings.Default.dEnd - Properties.Settings.Default.dStart; if (counter >= pbRows.Maximum) { MessageBox.Show("Dauer des Imports: " + ts.ToString("hh.mm.ss")); } } } }
Und die Methode zum Einlesen der Inserts:
public List<string> createDatabaseRows() { string[] strFiles = Directory.GetFiles(Environment.CurrentDirectory + "\\Scripts\\Rows\\"); List<string> lGetRows = new List<string>(); foreach (string str in strFiles) { SqlCeConnection conGetRows = new SqlCeConnection(ConnectionString); StreamReader srGetRows = new StreamReader(str); string line; while ((line = srGetRows.ReadLine()) != null) { lGetRows.Add(line); } } return lGetRows; }
Dieser Beitrag wurde von der dom bearbeitet: 10. September 2013 - 00:36