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

    Pergunta

  • 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.
    terça-feira, 21 de fevereiro de 2012 10:01

Todas as Respostas

  • 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.
    segunda-feira, 20 de fevereiro de 2012 14: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/

    segunda-feira, 20 de fevereiro de 2012 19:27
  • Danke schön. Die Gruppe hatte ich leider nicht gefunden. Irgendwie sind diese ganzen Foren etwas unübersichtlich geworden.
    terça-feira, 21 de fevereiro de 2012 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

    terça-feira, 21 de fevereiro de 2012 14: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.

    terça-feira, 21 de fevereiro de 2012 15:08
  • Nachtrag: Currentdb.execute hat nachwievor das Problem.

    terça-feira, 21 de fevereiro de 2012 15: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

    terça-feira, 21 de fevereiro de 2012 16: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.

    terça-feira, 21 de fevereiro de 2012 16: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




    terça-feira, 21 de fevereiro de 2012 16: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.

    terça-feira, 21 de fevereiro de 2012 16: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.




    terça-feira, 21 de fevereiro de 2012 16:45