none
Access 2010: Anfügeabfrage bricht ab mit "zuwenig Speicher"

    질문

  • Ich habe eine Anfügeabfrage erstellt, die die Daten einer verknüpften Access-Tabelle in eine verknüpfte ODBC-Tabelle (MySQL) kopieren soll. Diese Abfrage beendet sich stets mit der Meldung, dass nicht genug Speicher zur Verfügung steht.
    Wie kann man die Abfrage ändern, so dass die Abfrage ausgeführt wird?
    Hinweise in <http://support.microsoft.com/kb/286153/de> habe ich bereits erfolglos beachtet. Die Tabelle hat nur ca. 160.000 Datensätze.
    2012년 2월 21일 화요일 오전 10:01

모든 응답

  • Ich habe eine Anfügeabfrage erstellt, die die Daten einer verknüpften Access-Tabelle in eine verknüpfte ODBC-Tabelle (MySQL) kopieren soll. Diese Abfrage beendet sich stets mit der Meldung, dass nicht genug Speicher zur Verfügung steht.
    Wie kann man die Abfrage ändern, so dass die Abfrage ausgeführt wird?
    Hinweise in <http://support.microsoft.com/kb/286153/de> habe ich bereits erfolglos beachtet. Die Tabelle hat nur ca. 160.000 Datensätze.
    2012년 2월 20일 월요일 오후 2:19
  • Am 20.02.2012 schrieb Stefan Dreyer:

    Ich habe eine Anfügeabfrage erstellt, die die Daten einer verknüpften Access-Tabelle in eine verknüpfte ODBC-Tabelle (MySQL) kopieren soll. Diese Abfrage beendet sich stets mit der Meldung, dass nicht genug Speicher zur Verfügung steht.
    Wie kann man die Abfrage ändern, so dass die Abfrage ausgeführt wird?
    Hinweise in <http://support.microsoft.com/kb/286153/de> habe ich bereits erfolglos beachtet. Die Tabelle hat nur ca. 160.000 Datensätze.

    Frag doch am besten im Access Forum:
    http://social.msdn.microsoft.com/Forums/de-DE/accessde/threads

    Servus
    Winfried


    Connect2WSUS: http://www.grurili.de/tools/Connect2WSUS.exe
    GPO's: http://www.gruppenrichtlinien.de
    Community Forums NNTP Bridge: http://communitybridge.codeplex.com/

    2012년 2월 20일 월요일 오후 7:27
  • Danke schön. Die Gruppe hatte ich leider nicht gefunden. Irgendwie sind diese ganzen Foren etwas unübersichtlich geworden.
    2012년 2월 21일 화요일 오전 10:02
  • Hallo!

    Hast du schon einmal versucht, die Anfügeabfrage per VBA-Code mit Currentdb.execute bzw. Currentproject.Connection.execute zu starten?
    Falls das auch nicht klappt, könntest die VBA-Variante erweitern und die Datensätze in mehreren Blöcken in die MySQL-Tabelle schicken (Filter: id zw. x und y).

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch

    2012년 2월 21일 화요일 오후 2:38
  • Hast du schon einmal versucht, die Anfügeabfrage per VBA-Code mit Currentdb.execute bzw. Currentproject.Connection.execute zu starten?

    Ich bin der Meinung, ja. Werde ich aber noch mal prüfen.

    Falls das auch nicht klappt, könntest die VBA-Variante erweitern und die Datensätze in mehreren Blöcken in die MySQL-Tabelle schicken (Filter: id zw. x und y).

    So ähnlich haben wir das mittlerweile gelöst. Da es keine numerische ID gibt, ist ein LEFT JOIN auf die Zieltabelle nötig. Also: "INSERT INTO tabneu (...) SELECT TOP 50000 ... FROM tabalt LEFT JOIN tabneu ON tabneu.id = tabalt.id WHERE tabneu.id IS NULL"

    Vorab wird dann die Menge der Einträge in tabalt geprüft, um zu schauen, wie oft die Schleife durchlaufen werden muss.

    2012년 2월 21일 화요일 오후 3:08
  • Nachtrag: Currentdb.execute hat nachwievor das Problem.

    2012년 2월 21일 화요일 오후 3:46
  • Hallo!

    Ein anderer Gedanke kombiniert mit Vermutungen: da es sich um das Anfügen von Datensätzen an eine ODBC-verknüpfte MySQL-Tabelle handelt: hast du auch schon versucht, das Anfügen über eine Recordsetschleife umzusetzen?

    Normalerweise würde ich zwar behaupten, dass die SQL-Variante schneller sein muss, aber einen Versuch ist es wert. ;) Ich vermute nämlich, dass wegen ODBC (und MySQL?) nur ein datensatzweises Anfügen passiert. (Eventuell mit ODBC-Trace & Co. prüfen.)
    Bei der Recordsetschleife hättest du auch die Möglichkeit eine eigene Transaktion laufen zu lassen und somit nach x DS die Transaktion abzuschließen und eine neue zu starten.

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch

    2012년 2월 21일 화요일 오후 4:19
  • Die RecordSet-Variante haben wir auch erfolglos getestet. Mich wundert nur, dass Access erst alles in den Speicher lädt und dann neu anfügt. Wenn ich den MySQL-Server auf dem gleichen Rechner, auf dem auch Access läuft, installiere und die Abfrage dort ausführe, so kommt das DBMS problemlos mit dem Speicher aus.

    2012년 2월 21일 화요일 오후 4:36
  • Hast du beim Testen der Recordsetvariante auch eine eigene Transaktion probiert?

    Wenn ich den MySQL-Server auf dem gleichen Rechner, auf dem auch Access läuft, installiere und die Abfrage dort ausführe, so kommt das DBMS problemlos mit dem Speicher aus.

    Wie meinst du das? Du kannst die Abfrage auch als MySQL-Anweisung ausführen? Kopierst du Tabellen von einer MySQL-Tabelle in eine andere? .. dann kannst du doch auch eine PT-Abfrage verwenden oder die Anweisung über ADODB mit direkter Verbindung zum Server ausführen.


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch




    2012년 2월 21일 화요일 오후 4:38
  • Nein, aber ich würde jetzt mal vermuten, dass das nichts bringt. Die Transaktion läuft ja im Access ab und nicht auf dem MySQL-Server. Daher muss Access ja die Daten im Speicher halten um anschließend einen Rollback machen zu können.

    Und einen COMMIT pro Zeile möchte ich nicht machen, das würde extrem lange dauern.

    2012년 2월 21일 화요일 오후 4:44
  • Du kannst ja auch einen Commit alle 10000 Datensätze machen.

    Die Transaktion läuft ja im Access ab und nicht auf dem MySQL-Server.

    Der Speicher wird ja auch auf dem Client und nicht am MySQL-Server verbraucht, oder?

    Anm.: Wenn du eine Access-Abfrage manuell ausführst, läuft diese auch in einer Transaktion. Wie das in Zusammenhang mit einer ODBC-verknüpften Tabelle abläuft, weiß ich allerdings nicht.




    2012년 2월 21일 화요일 오후 4:45