Dezember 07, 2021, 13:20:18

Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!


Fehler 3048 „Mehr Datenbanken können nicht geöffnet werden.“

Begonnen von bahasu, November 21, 2013, 09:52:41

⏪ vorheriges - nächstes ⏩

bahasu

November 21, 2013, 09:52:41 Letzte Bearbeitung: November 21, 2013, 10:03:43 von bahasu
Hallo,

welche Maßnahmen gibt es, um den Fehler 3048 ,,Mehr Datenbanken können nicht geöffnet werden." zu verhindern?

Benutzt wird:
•   a2003 bzw. a2007 unter XP bzw. WIN 7
•   Frontend + Backend

Es gibt mehr als 20 von einander abhängige Kombifelder zur Datenselektion.
Mit http://www.office-loesung.de/ftopic443751_15_0_asc.php kann ich die Anzahl der noch verfügbaren TableID's verfolgen.
Nutze ich diese Auswahlfelder, sehe ich wie die Anzahl der verfügbaren ID's sinkt.
Beim Gebrauch von mal 10, mal > 15 Auswahlfeldern tritt der der obige Fehler auf.

Bislang habe ich versucht, den Fehler zu vermeiden mit:
•   Austausch von currentdb gegen currentdbc (http://microsoft.public.de.access.narkive.com/iAphsJlq/fehler-3048-mehr-datenbanken-konnen-nicht-geoffnet-werden)
•   Setzen von recordsource (Auswahlliste) bzw. SourceObject (Formular) auf "", wenn ich diese nicht benötige.
•   rs.close + set rs = nothing sind vorhanden.

Was gibt es für weitere Lösungswege?

Harald
Servus

ebs17

Domänenaggregatfunktionen hast Du auch nicht massenweise in Verwendung?

Bei Kombifeldern könntest Du den Datenherkunftstyp auf Werteliste setzen und solltest damit weg sein von TableID's. Bei abhängigen Kombifeldern muss ja eh laufend die Datenherkunft neu gesetzt werden.
Als Technik zur Erzeugung des Wertestrings aus einer Abfrage könnte man ADOSQLListe einsetzen, die Methode Getstring ist sehr zügig:
Public Function ADOSQLListe(ByVal SQLString As String, _
      Optional ByVal NumRows As Long = -1, _
      Optional ByVal ColumnDelimiter As String = vbTab, _
      Optional ByVal RowDelimiter As String = vbCrLf, _
      Optional ByVal NullExpr As String = "") As String

   Dim rs As ADODB.Recordset
   If NumRows = 0 Or NumRows < -1 Then Exit Function
   Set rs = New ADODB.Recordset
   rs.Open SQLString, CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
   If Not rs Is Nothing Then
      If Not (rs.EOF And rs.BOF) Then
         ADOSQLListe = rs.GetString(, NumRows, ColumnDelimiter, RowDelimiter, NullExpr)
      End If
      rs.Close
      Set rs = Nothing
   End If
End Function
Mit freundlichem Glück Auf!

Eberhard

bahasu

Hi Eberhard,

danke für Deine Tipps.

1. Domain-Funktionen hatte ich alle ersetzt durch eigene Funktionen.
2. Werde das mit den Wertelisten ausprobieren.

Danke

Harald
Servus

bahasu

Hi,

ist es richtig, dass eine Werteliste nicht mehr als 2048 Zeichen enthalten darf?

Harald
Servus

DF6GL

Hallo,
mmhmm,   in den Access Spez. steht ein Wert von über 32000 Zeichen bei Verwendung eines SQl-Strings...  Für die max. Anzahl Zeichen  einer Wertliste hab ich nichts gefunden.

http://office.microsoft.com/de-de/access-help/access-2010-spezifikationen-HA010341462.aspx

ebs17

Acc2000 gestattet bei der Werteliste eine Stringlänge von 2.048 Zeichen, die Folgeversionen dann 32.767 .
Mit freundlichem Glück Auf!

Eberhard

bahasu

Hallo Eberhard, hallo Franz,

danke für die Infos.

Zitat von: ebs17 am November 21, 2013, 10:40:49
... Getstring ist sehr zügig:


habe das mit dao und einer alternativen Routine umgesetzt.
Auch beim Überführen von 1000 Datensätzen in eine Werteliste ist die Geschwindigkeit ok.


Zitat von: ebs17 am November 23, 2013, 22:01:20
Acc2000 gestattet bei der Werteliste eine Stringlänge von 2.048 Zeichen, die Folgeversionen dann 32.767 .


Dann habe ich noch eine Reserve von ein paar tausend Zeichen.  :(

Habe in der Zwischenzeit festgestellt, dass ich entgegen der weiter oben stehenden Äußerung doch nicht überall auf "currentdbc" umgestellt hatte.
Ausgerechnet in der Prüfroutine, in der der freie Speicher ermittelt wurde, hatte ich das letzte currentdb übersehen.

Vergleich der Anzahl verfügbarer recordsets:
Mit diesem einem verbliebenem currentdb: 137
Nach Umstellung auf currentdbc: 1598

Habe daher diesen Beitrag auf erledigt  gesetzt.  :D

Harald
Servus

micmen

Hi,
der Thread ist zwar recht alt, aber inkl. des verlinkten anderen Threads ist er im Vergleich zu anderen zu diesem Thema ziemlich informativ - darum will ich hier aufsetzend nochmal nachfragen...

  • Gibt es da inzwischen gesicherte Erkenntnisse, was genau das problematischste Detail ist, das diesen Fehler verursacht?
  • Und gibt es inzwischen eine elegante Lösung, das Problem ohne Umbau der ganzen Anwendung zu lösen?
  • Was hat es mit den erwähnten Domänenaggregatfunktionen auf sich, in welchen Zusammenhängen könnten die kritisch sein?

.
Bei mir tritt der Fehler fast immer in einer bestimmten Zeile auf:
If IsNull(DSum("MeinFeldname1", "MeineAbfrage", "MeinFeldname2 = '" & MeinText & "'")) ThenWobei ich gestehen muß, daß es diese Abfrage in sich hat:
Die hat A) einen Funktionsaufruf als Filterkriterium drin und holt B) ihre Daten aus 3 Unter-Abfragen, von denen 2 auch noch UNION-Abfragen sind und eine ebenfalls noch einen Funktionsaufruf als Filterkriterium eingetragen hat...

Aus dem hier verlinkten Thread Fehlermeldung "kann keine weitere Datenbank öffnen" habe ich die beiden Prüfungen übernommen mit
db(i).Recordsets.Countund
Workspaces(0).Databases.CountIch weiß nicht, ob die überhaupt entscheidend sind und daher wirklich weiterhelfen...
Die erste bringt so etwas
Workspace: #Default Workspace#, Databases: 3

Database: 1
Recordsets: 43
3048: Mehr Datenbanken können nicht geöffnet werden.

Database: 2
Recordsets: 1
3048: Mehr Datenbanken können nicht geöffnet werden.

Database: 3
Recordsets: 0
3048: Mehr Datenbanken können nicht geöffnet werden.
wobei oft auch nur 2 Databases ausgegeben werden und die zweite bereits 0 Recordsets angegeben hat. Die erste hatte auch schon eine kleinere dreistellige Zahl angezeigt bekommen.
Und die zweite Prüfung bringt eine kleine Zahl wie etwa 3.
Und Reparieren/Komprimieren bringt nicht viel, weder bei diesen Zahlen, noch bei der Zeit, bis wieder der Fehler auftritt.

Das ganze ist eine Anwendung, die per einfache verknüpfte Tabellen in Front- und Backend geteilt ist und zuerst weit über 10 Jahre lang kein solches Problem hatte.
Vor etwa einem Jahr wurde wegen dieses Problems von Verwendung von CurrentDb umgestellt auf diese bekannte m_CurrentDb-Lösung und DB- und RS-Objekte werden schon seit Jahren auf Nothing gesetzt

Wobei ich mir aber nicht 100% sicher bin, ob es reicht, ein Objekt nur dann auf Nothing zu setzen, wenn es vorher eine Zuweisung bekommen hat - oder ob nicht rein nach einem Dim-Befehl schon ein Setzen auf Nothing etwas bringt, auch wenn das deklarierte Objekt in der Funktion/Prozedur dann doch nicht benutzt wurde?

danke

micmen

Jetzt habe ich es, daß der Fehler schon auftritt, wenn ich einfach eine recht simple Auswahlabfrage in der Datenblattansicht zu öffnen versuche, die nur 5 Felder enthält und nur auf zwei 1:n-verknüpfte Tabellen schaut. Ohne Filter, ohne Sortierung, ohne berechnete Felder - ganz primitive Dinger.
Auf der anderen Seite habe ich parallel aber auch Abfragen mit mehr Tabellen und auch Unterabfragen, einer Sortierung und einigen Filterkriterien, die aufgehen...

wäre für Infos dankbar

ebs17

Dieses Verhalten hast Du schon, wenn Du nur genau diese Abfrage öffnest und alles andere geschlossen ist?

Recordsets würde man nicht nur auf Nothing setzen, sondern vor allem auch nach Verwendung sofort schließen, wie es überhaupt zu einem guten und problemsenkenden Stil gehört, Objekte, die man selber öffnet, auch selber zu schließen.

Zitatohne Umbau der ganzen Anwendung
Reparatur oder grundhafte Sanierung? Das kommt darauf an ...
Wenn von Haus aus einfach und ressourcenschonend programmiert wurde, wird man kaum etwas umzubauen haben.
Mit freundlichem Glück Auf!

Eberhard