Bibliotheken für ADO.NET zum schnellen Masseneinfügen von Daten in eine Datenbank aus einer .csv-Datei?

8

Ich würde gerne wissen, ob Sie erweiterte ADO.NET-Bibliotheken für die Arbeit mit Datenbanken empfehlen können.

Ich habe festgestellt, dass LINQ-to-Entities hervorragend dazu geeignet ist, Daten aus Datenbanken zu extrahieren, aber überhaupt nicht zum Einfügen von Daten in Datenbanken. Seine fehlenden Funktionen wie schnelles Bulk-Insert, Culling von Duplikaten und die meisten erweiterten Funktionen, die Sie mit reinem SQL erreichen können.

Also: Können Sie einige ADO.NET-Bibliotheken empfehlen, die die erweiterten Funktionen von LINQ-to-Entities bieten?

    
Contango 19.02.2011, 19:15
quelle

2 Antworten

14

Die Klasse ADO.net SqlBulkCopy ermöglicht das schnelle Hochladen von Datensätzen in eine Tabelle:

%Vor%     
Tahbaza 19.02.2011, 19:20
quelle
3

Sie können LINQ Entity Data Reader verwenden, um eine IEnumerable-Liste mit SQL Bulk Copy hinter den Kulissen in eine Datenbank zu schreiben. Sie können diese Bibliothek verwenden, um die Ergebnisse einer LINQ-Abfrage direkt in die Datenbank hochzuladen, da die Ergebnisse einer LINQ-Abfrage IEnumerable sind.

Da es LINQ-to-everything-Adapter gibt, können Sie Tricks wie die LINQ to CSV-Bibliothek um die Daten mithilfe einer LINQ-Abfrage aus einer CSV-Datei zu extrahieren, dann den LINQ-Entitätsdaten-Reader , um einen Bulk zu schreiben diese Daten direkt in die Datenbank.

Fallstudie:

Problem: Lesen Sie eine .csv-Datei schnell in eine Datenbank. Die Verbindung zur SQL-Datenbank erfolgt über LINQ-to-Entitys von C #.

Lösung 1: Verwenden Sie die LINQ to CSV-Bibliothek , erstellen Sie einen LINQ Abfrage, um die gewünschten Daten herauszuziehen, und schreiben Sie sie dann mit den LINQ-to-Entity-Standardaufrufen (ctx.AddObject (), ctx.SaveChanges () usw.). Benötigte Zeit: 30 Sekunden für 20.000 Datensätze, da LINQ für jeden einzelnen Datensatz eine Abfrage generiert (sloooooow !!!!!).

Lösung 2: Verwenden Sie die LINQ to CSV-Bibliothek , erstellen Sie einen LINQ Abfrage, um die gewünschten Daten in einen IEnumerable zu ziehen, verwenden Sie LINQ Entity Data Reader , um diese Daten direkt in das Ziel zu schreiben Datentabelle. Benötigte Zeit: 3 Sekunden für 20.000 Datensätze.

Lösung 3: Verwenden Sie eine gespeicherte Prozedur mit SQL "Massenkopie". Benötigte Zeit: 2 Sekunden für 20.000 Datensätze. Diese Lösung ist jedoch ziemlich spröde, da sie auf einer gespeicherten Prozedur beruht und SQL-Massenkopien mit einigen CSV-Dateiformaten nicht kompatibel ist. Diese Methode erfordert außerdem, dass Sie eine Zwischenspeichertabelle zwischen der tatsächlichen Zieltabelle und der CSV-Datei verwenden, um mit Dateiformatierungsproblemen umzugehen und bei der Normalisierung zu helfen.

Und hier ist der Quellcode für Lösung # 2:

%Vor%     
Contango 20.02.2011 16:00
quelle