MS Access 2010: "Cannot open any more databases."
Während kämpft mit einem einzigen legacy MS-Access-Anwendung, mit der ich konfrontiert diese seltsamen Fehler:
Cannot open any more databases.
Die Anwendung macht umfangreichen Gebrauch von UNION
sql-Anweisungen. So scheint dies, dass access schlagen die Grenze von 2048 Tabellen öffnen. Jede andere chance, als loswerden von diesen Gewerkschaften?
- Wow, 2048 Tabellen.. aus Interesse, wie haben die Dinge so schlecht?
- Es gibt nicht viele Tabellen in der DB, natürlich. Es sind weniger als 50 Tabellen und über 100 Anfragen.
- Trotz Kieren highlight, ich bin erstaunt, dass keine der Antwort, lehnen Sie sich mehr in Richtung einer ernsthaften re-denken Sie an die UNION, sql, falls die Daten-Struktur optimiert ist, auch dann sollten Sie nie brauchen, um am Ende mit einer so großen Abfrage. Besonders schlimm in access als es läuft alles lokal und könnte ein Leben lang dauern.
- Das ist wahrscheinlich, weil meine Frage war, ob es andere Wege als die Tötung der Gewerkschaften :). Ich bin nur nicht sehr viel Wert auf die Optimierung der gesamten Struktur zu vermeiden, die Gewerkschaften.
- Ja, Gewerkschaften sind ein spezieller Fall und zu 90% der Zeit verwendet, die von Novizen, um einfache Aufgaben ausführen, von denen Sie am Ende produzieren gewaltige Datenmengen, auch nachdem Sie gegangen sind, und im Laufe der Zeit sind unzuverlässig, die auf Informationen zurück, wenn falsch verwendet
- das ist definitiv wahr
- Performance-Tipp:
UNION ALL
ist viel schneller und verbraucht weniger Aufwand alsUNION
wenn die Fragen, die Sie stoßen sind nicht auf Duplikate, die Sie wollen, entfernt. - Yep, die meisten von denen, die Gewerkschaften genutzt. Aber es hilft nicht, mit der Anzahl der offenen "Datenbanken" (oder so).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte dieses problem bei der Verwendung von verknüpften Tabellen. Die Grenze wurde erreicht, weil etwa 10 excel-Dateien wurden von verschiedenen Abfragen immer und immer wieder. So wird die Anzahl von offenen Tabellen, war mehr oder weniger das Produkt von Abfragen und Tabellen.
Ich Stelle mir vor mit Gewerkschaften vermehrt dieses problem.
Die Lösung für mich war kopieren von verknüpften excel-Tabellen in Access-native Tabellen ersten. Dann führen Sie die gleichen Abfragen mit den nativen Tabellen.
Fehler 3048: Mehr Datenbanken können nicht geöffnet werden
btw.Oft geschieht dies mit großen/komplexen Formularen mit vielen Unterformularen und/oder comboboxes/Listboxen.
Versuchen zu tun, was um sagt. Sind eine gute Sache, sowieso. Aber ich denke, dass diese änderungen nicht Ihr problem lösen.
Erst kürzlich habe ich dasselbe problem zu lösen. Ich habe festgestellt, dass immer dann Auftritt, wenn ein bestimmtes Formular geöffnet wurden. Diese form hatte viele Unterformulare und combos.
Ersten. Versuchen Sie, Ihre form oder Formen einfacher: brauchen Sie wirklich alle Unterformulare? Alle Unterformulare geladen werden muss, immer?
Ich mein problem lösen zu verteilen Unterformulare werden in verschiedenen Seiten eines Register-Steuerelement. Dann laden und entladen Unterformulare dynamisch im Change-Ereignis.
Zunächst nur Unterformulare auf der ersten Seite muss die "SourceObject" - Eigenschaft zugewiesen. Der rest, hat diese Eigenschaft leer.
Im change-Ereignis ist, versuchen Sie etwas wie das hier tun:
Dies ist eine generische Funktion zum iterieren über alle Unterformular-Steuerelemente. Wenn nicht in der aktiven Seite, entfernen Sie es. Im anderen Fall, nehmen Quelle-Objekt aus der tag-Eigenschaft.
Werden Sie brauchen, um zu vermeiden, Verweise zu entladen Unterformulare, d.h., wenn "Subform1" entladen wird, erhalten Sie eine Fehlermeldung mit etwas wie dieses:
Mich.Subform1.Form.InvoiceId
Diese änderung noch andere Vorteile. Ihr Formular wird schneller geladen und der Datensatz wird die navigation schneller.
Der einzige wirkliche Weg, um dieses problem ist die Verwendung einer temporären Satz von Tabellen. Legen Sie die Ergebnisse aus Ihrer Gewerkschaften in temp-Tabellen und dann verwenden Sie diese, um die Anzahl der Tabellen pro Abfrage. Ich in der Regel Präfix meinem temp-Tabellen mit einem Unterstrich ( _tmpCustomers ) und vernichten Sie Sie dann wenn ich fertig bin.
Bedanken möchte ich mich ricardohzsz für seine schönen code! Es hat mir wirklich geholfen, um meine Datenbank-performance sowie Fehler beseitigen 3048.
Ich würde die Abstimmung der post, aber ich habe nicht genug von einem guten Ruf hier zu Stimmen.
Musste ich einige änderungen vornehmen, um es an die Arbeit für meine Bedürfnisse (ich brauchte die Unterformulare zu gestatten, Ergänzungen und änderungen und mit diesem code gemacht, diese nur-lese -). Ich bin die Buchung der Veränderungen hier im Fall kann es helfen, jemand anderes:
End Sub
Ihre Anwendung zu öffnen versucht, zu viele verbindungen zu der Access-Datenbank. Es ist nicht nur die Tabellen in Ihrer sql-Anweisung hinzufügen von bis zu 2048, auch die Formulare, Berichte, comboboxes, unverschlossenen recordsets usw. hinzufügen, bis die Anzahl der verbindungen, die von Ihrer Anwendung verwendet werden. Einige Dinge, die Sie ausprobieren können, hier:
1. Schließen Sie die Ressourcen (z.B. Datensätze), die Sie nicht wirklich verwenden.
2. Wenn Sie die Nutzung der domain aggergate Funktionen( z.B. DLookup), ändern Sie es mit Elookup, wie es explizit bereinigt nach sich selbst.
3. Sie können ändern Sie Ihre sql-code, um die Verwendung von temporären Tabellen.
Hoffe, es hilft.
Müssen Sie bewerten jede Abschnitt Ihre UNION-Abfrage, und alle anderen Abfragen, dass er abhängig ist. Sie erhalten möglicherweise eine Verbesserung durch die Schaffung einer temp-Tabelle, stellt eine Abfrage mit mehreren verknüpften Tabellen, und verwenden Sie die temp-Tabelle statt.
Als ich begonnen habe die Entwicklung mit Access hatte ich die Angewohnheit, die großen denormalisierten Schneeflocke Abfragen und nutzen Sie als Quelle für Berichte und Listboxen. Ich habe keine Tabellen mit mehr als 100.000 Datensätze und die Datenbank lief schnell. Später fing ich an, erhalten Sie die lästige kann Nicht geöffnet werden "mehr Datenbanken" Fehler und entdeckt die Fehler meiner Wege.
Ich ein Formular erstellt, die helfen, verfolgen Sie, wie viele Datenbanken verbindungen, die Sie verwendet haben und wie viele bleiben. Wenn Sie fügen Sie dieses Formular, um Ihre Datenbank und klicken Sie auf Requery nach dem öffnen, Ihre Anfragen und andere Objekte, werden Sie in der Lage zu finden Sie die Objekte, die eine große Anzahl von verbindungen.
Beachten Sie, dass jeder Verweis auf eine lokale Tabelle oder query-Objekt verwendet 1 Verbindung. Ein Verweis auf eine verknüpfte Tabelle verwendet 2 verbindungen. Eine Abfrage, die joins aus zwei verknüpften Tabellen werden 5 verbindungen. Wenn die Abfrage wird immer genannt, die von vielen anderen Abfragen in der union, die Anzahl summiert sich schnell. Vielleicht brauchen Sie nicht alle Felder aus einer verknüpften Tabelle in einer Unterabfrage. In diesem Fall können Sie eine neue Abfrage.
Las ich eine Menge über diese online und einige Leute denken, Access/Jet hat rund 2.000 TableID ist aber, dass die Anzahl nicht überein mit dem, was meine form berichten. Die berichteten zahlen von der form ausrichten perfekt mit dem Fehler. Kann es sein das zählen etwas anders als TableID, aber er stellt ein genaues Messgerät zum Messen der Menge der verbindungen verwendet, wie Sie Sie öffnen neue Objekte.
Lesen Sie mehr und laden Sie es von hier:
https://access.wordpress.com/2014/04/01/how-many-database-connections-are-still-available-in-an-access-database/