C#-Programm mit Datenbankzugriff beschleunigen ?
-
Hallo zusammen,
ich hatte heute vor eine bestehende VisualBasic-Anwendung auf ASP-Basis etwas zu optimieren und die gleiche Funktionalität in C# nachzubauen.
Das ASP-File liest x Zeilen aus einem Textfile aus, generiert daraus INSERT-Strings für eine Datenbank und führt diese einen nach dem anderen aus (per ADO).Ich habe die gleiche Funktionalität jetzt so einfach wie möglich nachgebaut, meine Lösung ist aber ca. 50% langsamer und das kann ich absolut nicht nachvollziehen.
Ich teste das Ganze mit 200.000 Datensätzen (=Zeilen im Textfile) und starte jedes INSERT-Statement einzeln mittels myCommand.ExecuteNonQuery();
Gibt es irgendeine Möglichkeit dieses Progremm entscheidend zu beschleunigen ??
using System; using System.Collections.Generic; using System.Text; using System.Data.SqlClient; using System.IO; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { DateTime d1 = DateTime.Now; StreamReader sr = new StreamReader("PRODPUCPC"); String line; String mi=""; string[] arrIP; SqlConnection myConnection = new SqlConnection("user id=sa;" + "password=***;server=localhost;" + "Trusted_Connection=yes;" + "database=LoDa; " + "connection timeout=30"); try { myConnection.Open(); } catch (Exception e) { Console.WriteLine(e.ToString()); } SqlCommand myCommand = new SqlCommand("insert into ..." ,myConnection); for (int i = 0; i < 200000; i++) { myCommand.ExecuteNonQuery(); line = sr.ReadLine(); arrIP = line.Split(' '); for (int j = 0; j < arrIP.Length; j++) { mi.Insert(0, arrIP[j]); } } try { myConnection.Close(); } catch (Exception e) { Console.WriteLine(e.ToString()); } DateTime d2 = DateTime.Now; TimeSpan ts = new TimeSpan(d2.Ticks - d1.Ticks); Console.WriteLine(ts.Minutes+" "+ts.Seconds + " " + ts.Milliseconds); Console.ReadLine(); } } }
Ich lese in diesem Code noch nicht direkt aus dem Textfile, simuliere diesen Vorgang aber.
Danke
Gawan
-
Evtl. bringts schonmal was den
String mi="";
gegen nen StringBuilder auszutauschen?
-
mi.Insert(0, arrIP[j]);
Das Funktioniert so nicht in C#. In C# sind string Konstant, Du kannst sie also nicht verändert. Statt dessen wird jedesmal ein neuer String erzeugt. Wenn Du das debuggst wirst Du feststellen das in mi nichts interted wird.
Die Zeile müßte daher lauten:
mi = mi.Insert(...)
Wie Du Dir vielleicht denken kannst ist dieser Vorgang natürlich alles anderee als Perfomant, daher hat geeky vollkommen recht, Du musst Hier einen Stringbuilder benutzen.