Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

Re: CSV Datei in eine Tabelle auf SQL-Server laden

  Alt 5. Nov 2004, 15:05
Zitat von AndreT:
Ich muss Datensätze aus einem CSV-File in eine SQL-Server-Tabelle laden. Die Anzahl der Datensäte beträgt min 600000 Stück.
Sie kommen gesplittet in mehreren Files an. Diese Files kopiere ich automatisch der Reihe nach in eine "temp.csv" um. Auf dieser Datei habe ich eine ODBC-Connection liegen.
Das würde ich nicht tun.
Durch die Treiberschicht von ODBC hast du schon einen grossen Performanceverlust.
Ich würde jede Datei direkt in eine TStringList einlesen und dann Zeile für Zeile in die Einzelfelder zerlegen.
Siehe Code-Library: http://www.delphipraxis.net/internal...ct.php?t=29791
Zitat von AndreT:
somit habe ich unter Dephi eine ADODataConnection1, ein AdoTable1, und eine DataSource1. und ich habe eine ADODataConnection2, ein AdoTable2, und eine DataSource2 die mir die Verbindung zur SQL-Server-Tabelle herstellt.
Ein ADOTable ist schlecht, da du ja nicht alle Datensätze vom Server abrufen, sondern nur einfügen willst.
Deshalb nimm eine ADOQuery mit den Eigenschaften:
Delphi-Quellcode:
CursorLocation := clUseClient;
SQL.Text := 'SELECT * FROM tabelle WHERE 0=1';
Hier noch ein Beispiel:
Delphi-Quellcode:
   liste := TStringList.Create;
   liste.LoadFromFile(fname);
   // leere Zeilen entfernen
   RemoveEmptyStrings(liste);

   ProgressBarImport.Max := liste.Count - 1;
   for n := 0 to liste.Count - 1 do
   begin
      ProgressBarImport.Position := n;
      Application.ProcessMessages;
      s := liste.Strings[n];

      ADOQuery1.Append;

      FBulkInsert.DataSet['KFZ'] := ExtractDelimited(1, s, delims);
      FBulkInsert.DataSet['PLZ'] := ExtractDelimited(2, s, delims);
      FBulkInsert.DataSet['EPL'] := ExtractDelimited(3, s, delims);
      FBulkInsert.DataSet['TOUR'] := ExtractDelimited(4, s, delims);
      FBulkInsert.DataSet['TIME_NORM'] := ExtractDelimited(5, s, delims);
      FBulkInsert.DataSet['TIME_FRUEH'] := ExtractDelimited(6, s, delims);
      ADOQuery1.Post;
   end;
Andreas
  Mit Zitat antworten Zitat