![]() |
CSV Datei in eine Tabelle auf SQL-Server laden
Hallo zusammen
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. 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. Wie bekomme ich jetzt die Daten aus der ersten Connection an die Tabelle der 2.Connection angehängt? Ich steh da vor einem Rätsel :coder2: und wer Euch echt Dankbar, wenn mir jemand helfen könnte. Ist mein Lösungsansatz überhaupt sinnvoll? oder gibt es eine Bessere Möglichkeit? Danke Gruss PS: BDE kommt nicht in Frage. |
Re: CSV Datei in eine Tabelle auf SQL-Server laden
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
a) beim SQL-Server würde ich das ADODataSet empfehlen b) zum Code
Delphi-Quellcode:
c) wenn deine CSV-Datei das Format der Tabellenstruktur hat, dann könntest du über BulkCopy bcp.exe gehen
while not AdoTable1.EOF do
begin AdoDataSet.Insert; AdoDataSet.FieldByName('Feld1').AsString := AdoTable.FieldByName('FeldA').AsString; AdoDataSet.FieldByName('Feld2').AsInteger := FunktionEinerKonvertierung(AdoTable.FieldByName('FeldB').AsString); AdoDataSet.Post; AdoTable1.Next; end; |
Re: CSV Datei in eine Tabelle auf SQL-Server laden
Zitat:
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: ![]() Zitat:
Deshalb nimm eine ADOQuery mit den Eigenschaften:
Delphi-Quellcode:
Hier noch ein Beispiel:
CursorLocation := clUseClient;
SQL.Text := 'SELECT * FROM tabelle WHERE 0=1';
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; |
Re: CSV Datei in eine Tabelle auf SQL-Server laden
Danke
Das CSV-File hat die gleiche Struktur wie die Tabelle der DB. Wo finde ich diese bcp.exe? Ist das ein Dephi-Modul? zu der Sache mit dem Eof, da hab ich Angst, das die Laufzeit bei der Menge Datensätze zu groß wird. |
Re: CSV Datei in eine Tabelle auf SQL-Server laden
die bcp.exe findest du unter dem SQL-Server-Verzeichnis
z.B. C:\Programme\Microsoft SQL Server\80\Tools\Binn |
Re: CSV Datei in eine Tabelle auf SQL-Server laden
Ich habe gerade mal die EOF-Methode ausprobiert und bin zu dem Ergebnis gekommen, das ich für 90.000 Datensätze rund eine Halbe Stunde benötige. Das ist zu lange, wenn man bedenkt, das es sich bei mir um die 600.000 Datensätze drehen soll / muss.
|
Re: CSV Datei in eine Tabelle auf SQL-Server laden
nun das sind 50 Datensätz pro Sekunde
Hast du irgendwelche Konvertierungsroutinen wie DateToStr oder Format im Code enthalten Wird beim Einlesen für jeden Datensatz eine Selektion wird die Daten nachreferenziert Werden die Daten einmalig eingespielt oder des öfteren Baue eine Anwendung und führe diese direkt am Server aus, geht's schneller |
Re: CSV Datei in eine Tabelle auf SQL-Server laden
Die Datensätze werden grundsätzlich erstmal nur einmalig eingelesen ohne das irgendwelche Abfragen drüber her laufen (bis jetzt).
Der Datenimport in dieser größe findet allerdings Monatlich statt. Mein Augenblicklicher nächster Ansatz ist: die Daten über ein DTS-Package rüberzuholen. Laufzeit 4,5 Sekunden. Allerdings, da die Rohdaten in mehreren Files kommen, muss ich ein File umbenennen in die Datei auf die meine ODBC - Verbindung zeigt. Ist die Datei abgearbeitet, muss die nächste umbenannt und eingelesen werden.usw. Allerdings bekomme ich momentan das DTS-Package über Delphi nicht angesprochen. Ich kann zwar als ADO-Connection den Provider für DTS-Packages auswählen, aber es nimmt keine der von mir eingegebenen Datenquellen an (zB \\SERVERXY\Package1 ). gibt es da einen Trick? das Package liegt auf einem MS-SQL-Server in einem Netzwerk, also nicht hier bei mir Lokal. Rechte hab ich alle auf dem Server. |
Re: CSV Datei in eine Tabelle auf SQL-Server laden
der Datenexport beim SQL-Server funktioniert mit DTS
hier kannst Du auch ein VB-Script generieren lassen, wo du Anhaltspunkte für deine eigene Programmierung hast BCP im Batch-Betrieb, schon ausprobiert ? |
Re: CSV Datei in eine Tabelle auf SQL-Server laden
So, das ganze ist jetzt über ein DTS-Package gelöst, was von Delphi ausgelöst wird.
Jetzt muss nur noch irgendwo eine Rückmeldung erfasst werden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz