Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - Datentransfer von Datei nach SQL-Server und zurück


Oppi35 - Sa 15.09.12 08:02
Titel: Datentransfer von Datei nach SQL-Server und zurück
Hallo Zusammen,

ich möchte eine hohe Anzahl an Datensätzen (über 1 Mio. Datensätze mit ca. 100 Spalten) aus einer CSV-Datei in den SQL Server bringen. Den Weg, den ich bisher gegangen bin ist folg.:
CSV-Datei in Entitäten im Arbeitsspeicher laden -> alle Daten mit einer Abfrage zum SQL-Server exportieren

Bei der Arbeit haben wir teilweise noch sehr alte Rechner im Einsatz. Von daher kam es mit zunehmender Datensatzanzahl in den Abfragen zuletzt häufiger zu Speicherüberlastungen. Grund ist, dass alle Datensätze erst in den Arbeitsspeicher geladen werden.

Ich würde jetzt gerne jeden Datensatz einzeln behandeln. Das heißt, erster Datensatz einlesen->Datensatz zum SQL-Server schreiben, Datensatz aus dem Speicher entfernen und den nächsten Datensatz einlesen.

Das gleiche übrigens auch umgekehrt, also Daten aus dem SQL-Server in z.B. eine CSV-Datei.

Ich wollte jetzt nicht anfangen, einfach jeden Datensatz mit "INSERT INTO..." einzeln zu schreiben. 1 Mio. Abfragen abzuschicken ist event. auch nicht der beste Weg.

Weiß jemand, wie man dieses Problem am Besten behandeln kann?


Th69 - Sa 15.09.12 09:12

Hallo Oppi35,

dann solltest du dir mal die Klasse SqlBulkCopy [http://msdn.microsoft.com/de-de/library/system.data.sqlclient.sqlbulkcopy.aspx] ansehen. Die Datenquelle (d.h. bei dir die CSV-Datei) müßte dann jedoch mithilfe der IDataReader-Schnittstelle gelesen werden (also z.B. mittels OLEDB).
Dies geht jedoch nur in Richtung SqlServer, für das Auslesen würde ich dann doch einfach einen SqlDataReader verwenden und in einer Schleife dann die einzelnen Spalten in eine CSV-Zeile schreiben (mit GetValue(s)).


Christoph1972 - Sa 15.09.12 14:46

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Die Datenquelle (d.h. bei dir die CSV-Datei) müßte dann jedoch mithilfe der IDataReader-Schnittstelle gelesen werden (also z.B. mittels OLEDB).
GetValue(s)).


Ich würde den LumenWorks Reader nehmen. Der ist viel schneller und von der Handhabung einfacher als OLEDB.Guckst du hier [http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader].