Text-Datei importieren in generische Datenbank mit SQL
Ich bin versucht derzeit, import ein Semikolon getrennte Textdatei in eine Datenbank in c# mit OleDb, wo ich weiß nicht, der Typ (SQL Server, Access, Oracle, MySQL, postgreSQL, etc.) Derzeit bin ich beim Lesen in der Datei als eine Datenbank mit der Jet-text-Leser dann die Schaffung einer vorbereiteten insert-Anweisung, füllen Sie die Felder aus, dann Begehen am Ende. Während dies funktioniert, es ist langsam und für Millionen von Zeilen, es dauert viel zu lange.
Also meine Frage: Hat jemand noch andere Gedanken auf, wie man am besten eine Textdatei importieren, um eine generische Datenbank, oder Kommentare zu meinen Ansätzen, führen zu einer schnelleren import?
Kann ich nicht verwenden 3rd-party-Bibliotheken oder software, um dies zu tun, denn es ist Teil eines größeren Projekts,
- Wo konkret werden Sie Probleme haben? Die Frage ist ziemlich allgemein. Ist das problem mit dem Zusammenführen von Daten ohne Schlüssel? Oder ist das problem mit der mechanik, die über das dataset. Auch, Nicht sicher, was du meinst, durch das laden einer leeren db, um das dataset.
- Ich bin versucht, herauszufinden, der beste Weg, um Daten aus Textdateien in eine Datenbank, die ich nicht wissen, die Art der. Wenn der Merge ist die beste Art und Weise, wie es zu tun, ohne Schlüssel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, diese
http://filehelpers.sourceforge.net
....warum würden Sie wollen, laden Sie den db in das dataset? Haben andere Datenbank verfolgen die Einzigartigkeit (wenn es so ein Wort gibt). Beim importieren, überprüfen Sie, wenn vorhanden, in die Datenbank für die Protokollierung, wenn Nein, dann Last auf Generische Datenbank.
Warten, für einige andere Antworten zu diesem thread, kriegen wir vielleicht eine bessere Idee.
Nicht gerade elegant, aber die Leistung kann besser sein:
Während Sie noch einfügen jeder Zeile getrennt, Sie würden sich nicht erstellen, da ziemlich viel Netzwerk-traffic.
Zu erarbeiten, sind die original-Methode generiert die Anweisungen auf dem client und führt dann auf dem client, wodurch der Netzwerk-Datenverkehr für jede Zeile. Mein Vorschlag wäre, generieren Sie den Anweisungen auf dem server (in einer gespeicherten Prozedur) und Sie auf dem server ausführen, was keine neue Netzwerk-traffic.
Die "richtige" Lösung wäre die Verwendung einer Datenbank-spezifischen import-tool (wie SQL Loader für Oracle). Die performance-Gewinne sind enorm. (Wir laden riesige Tabellen mit 20 Mio Zeilen in etwa 5 Minuten). Aber natürlich, das ist nicht sehr allgemein.
Gut, ich schaffte es, die Zeilen der text-Datei in die Datenbank, dataset, und so weit diese Methode scheint schneller zu sein. Ich verwendet
Jetzt ist natürlich nur immer auf den DataAdapter.Update(Dataset) zu arbeiten. Online-Suche, das wird Spaß machen...
Update
Diese Methode führt nicht schneller zu Ergebnissen als die DataAdapter.Update-Befehl wird Zeile für Zeile Einfüge.
BULK INSERT dbo.ImportTest
AUS 'C:\ImportData.txt'
WITH ( FIELDTERMINATOR =',', FIRSTROW = 2 )
Ihre beste Wette ist zu kaufen, ein off-the-shelf-Anwendung, dies zu tun.
Professionelle Off-The-Shelf-Anwendungen mit nativen Treibern und Feineinstellung für jede Art von Datenquelle Sie Treffer vor. Dies ist immer unter der Decke, so dass Sie nicht sehen, wie Sie gehen über es. Zum Beispiel, bulkcopy ist gegen SQL Server; Oracle hat eine Daten-Pumpe.
Das problem mit den Rollen Ihrer eigenen ist, dass Sie entweder das Geld ausgeben, um die Feinabstimmung Ihrer Anwendung auf arbeiten mit allen Arten von Quellen, die Sie wahrscheinlich zu begegnen ODER Sie nehmen einen enormen performance-hit durch Verwendung der generischen ODBC /ADO /Whatever Treiber.
Am Ende des Tages, Sie sind besser dran, entweder verlassen diese Ihr Produkt oder einfach nur den Umgang mit den unvermeidlichen langsamen Ansatz, dass Sie gezwungen sind, zu nehmen. In diesem Fall bedeutet, dass die Verwendung einzelner insert-Anweisungen für alles.
So, wie viel Geld haben Sie für die Entwicklung von Ressourcen?