Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: bahasu am November 21, 2013, 09:52:41

Titel: Fehler 3048 „Mehr Datenbanken können nicht geöffnet werden.“
Beitrag von: bahasu am November 21, 2013, 09:52:41
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
Titel: Re: Fehler 3048 „Mehr Datenbanken können nicht geöffnet werden.“
Beitrag von: ebs17 am November 21, 2013, 10:40:49
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
Titel: Re: Fehler 3048 „Mehr Datenbanken können nicht geöffnet werden.“
Beitrag von: bahasu am November 21, 2013, 10:44:51
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
Titel: Re: Fehler 3048 „Mehr Datenbanken können nicht geöffnet werden.“
Beitrag von: bahasu am November 23, 2013, 19:25:50
Hi,

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

Harald
Titel: Re: Fehler 3048 „Mehr Datenbanken können nicht geöffnet werden.“
Beitrag von: DF6GL am November 23, 2013, 19:37:36
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
Titel: Re: Fehler 3048 „Mehr Datenbanken können nicht geöffnet werden.“
Beitrag 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 .
Titel: Re: Fehler 3048 „Mehr Datenbanken können nicht geöffnet werden.“
Beitrag von: bahasu am November 24, 2013, 13:03:47
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
Titel: Re: Fehler 3048 „Mehr Datenbanken können nicht geöffnet werden.“
Beitrag von: micmen am Oktober 26, 2021, 17:03:45
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...


.
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" (http://www.office-loesung.de/ftopic443751_15_0_asc.php) 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
Titel: Re: Fehler 3048 „Mehr Datenbanken können nicht geöffnet werden.“
Beitrag von: micmen am November 05, 2021, 12:07:33
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
Titel: Re: Fehler 3048 „Mehr Datenbanken können nicht geöffnet werden.“
Beitrag von: ebs17 am November 05, 2021, 13:05:51
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.