Die Situation: Ich erstelle eine automatisierte Aufgabe, die MySQL (über ODBC) abfragt und die Ergebnismenge mithilfe von OLEDB in eine MS Access-Datenbank (.mdb) einfügt.
Der Code:
%Vor%Die Probleme:
Die Speicherauslastung wird sehr hoch (300 MB ++), während sich die MS Access-Dateigröße nicht ständig ändert! Es scheint so, als ob die Einfügung die Daten zwischenspeichert, anstatt sie auf der Festplatte zu speichern.
Es ist sehr langsam! Ich weiß, dass meine Abfrage innerhalb weniger Sekunden ausgeführt wird, aber der Einfügeprozess dauert lange.
Ich habe versucht, eine vorbereitete Anweisung in MS Access zu verwenden und die Werte als Parameter anstelle von string concat einzufügen, um eine Einfügeabfrage zu erstellen. Allerdings bekomme ich diese Ausnahmebedingung:
Datentyp stimmt nicht mit dem Kriterienausdruck überein.
Weiß jemand, wie man das repariert oder einen besseren Ansatz hat?
Danke für die Antworten. Ich habe gerade das Hauptproblem in meinem Code gefunden. Der Grund für die hohe Speicherauslastung (Problem Nr. 1) war, dass ODBC die Daten unabhängig von der C # -Anstellung (DataReader) von MySQL zwischenspeichert. Dieses Problem wird behoben, indem das Kontrollkästchen Don't cache results of forward-only cursors
in den DSN-Einstellungen aktiviert wird. Dies machte auch den Prozess etwas schneller (30%). Ein konkreterer Ansatz ist jedoch immer noch, was Brian Pressler und Egil Hansen vorgeschlagen haben. Aber da sie Softwareinstallation und / oder Migrationsplan benötigen, wäre der einfachste Weg, sich an diesen Code zu halten.
Sie können einen VBA-Makro erstellen, der die Methode DoCmd.TransferDatabase verwendet, um sie zu ziehen Daten über ODBC in Ihre Access-Datenbank. Es wäre wahrscheinlich auch viel schneller und einfacher.
Um den VBA-Code von einem externen Programm oder einer geplanten Aufgabe auszuführen, initiieren Sie einfach Access, um Ihre Datei mit der Befehlszeilenoption / x zu öffnen, und das Makro wird beim Start ausgeführt. Ein GB Daten wird jedoch noch eine Weile dauern. Ich fand einen Artikel von David Catriel, der dies implementiert hat Annäherung .
Eine noch bessere Option ist die Verwendung eines anderen Back-Ends der Datenbank-Engine wie die kostenlose Version von SQL Server Express. Dann haben Sie viel mehr Optionen und es ist viel robuster. Wenn Sie MS Access-Formulare und -Berichte benötigen, können Sie eine ADP-Projektdatei erstellen, wenn Sie SQL Server verwenden, oder Sie können verknüpfte Tabellen verwenden, um Ihre Daten abzurufen. Sie könnten sogar Access als Front verwenden -end an Ihre MySQL-Datenbank , anstatt alle Daten zu kopieren, wenn dies Ihren Anforderungen entspricht.
Statt Code zu schreiben, können Sie sich vor dem Mittagessen an SQL Server Integration Services (SSIS) wenden. Es ist als Erweiterung zu Visual Studio verfügbar, falls Sie es nicht auf Ihrem Computer haben bereits mit SQL Server.
Mit SSIS können Sie ein wiederverwendbares SSIS-Paket erstellen, das über die Befehlszeile oder die geplante Aufgabe ausgelöst werden kann. Dieses Handbuch zeigt, wie Sie Daten aus MySQL in SQL ziehen können Server, aber der SQL Server-Teil sollte leicht zu mit Access
einige Änderungen mit Kommentar, um eine Transaktion für die Befehlsausführung hinzuzufügen. Wenn Transaktionen nicht manuell gesteuert werden, werden sie jedes Mal automatisch erstellt und festgeschrieben. Dies ist eine zeitraubende Aktion.
%Vor%Erstellen Sie einen DSN (Datenquellenname) für die SQL Server-Datenbank. Wählen Sie dann diesen DSN aus, indem Sie die Microsoft Access-Datenbank öffnen und auswählen, aus diesem DSN zu importieren. Sie sollten die Möglichkeit haben, genau diese 1-GB-Tabelle zu importieren (Schema, Daten, alles).
Weitere Informationen zur Verwendung eines DSN: Ссылка
Alternativ können Sie einfach mit diesem DSN eine Verknüpfung zur SQL Server-Datenbank herstellen (nicht in eine Access-Tabelle importieren) und den Import komplett überspringen.