none
Access 2003 Laufzeitfehler 3048 - Formularinstanzen

    Frage

  • Für eine Anwendung in Access 2003 stelle ich eine Reihe von Datensätzen aus einer Abfrage in Formularinstanzen über VB dar. Ab einer bestimmten, allerdings variierenden DS-Anzahl (ab ca 39 Datensätzen) tritt Laufzeitfehler 3048 auf mit der Meldung: "Mehr Datenbanken können nicht geöffnet werden". Ich finde hierzu keine Spezifikation (Mögliche Anzahl Formularinstanzen bzw. Laufzeitfehler 3048).

    Meine Frage(n):
    1. Wo finde ich eine vollständige Liste der (auffangbaren) Laufzeitfehler?
    2. Wieviele Instanzen eines Formulars können geöffnet werden?

    Vorab vielen Dank

    Montag, 26. März 2012 11:14

Antworten

  • Hallo!

    Die Fehlermeldung "Mehr Datenbanken können nicht geöffnet werden" kann von zu vielen offenen Recordsets bzw. Database-Referenzen kommen. (Auf Recordsets der Kombinationsfelder u. ä. nicht vergessen.)

    Beispiel zum Testen:

    Private Sub test()
    
       Const MaxRsCount As Long = 500
    
       Dim rs() As DAO.Recordset
       ReDim rs(MaxRsCount)
    
       Dim i As Long
       For i = 0 To MaxRsCount
          Set rs(i) = OpenTestRecordset()
       Next
    
    End Sub
    
    Private Function OpenTestRecordset() As DAO.Recordset
       Set OpenTestRecordset = CurrentDb.OpenRecordset("select * from Tab1")
    End Function

    => Bei meinem Test war bei 252 Recordset schluss.

    Variante, die mehr erlaubt:

    Private Sub test()
    
       Const MaxRsCount As Long = 500
       Dim db As DAO.Database
       Dim rs() As DAO.Recordset
       ReDim rs(MaxRsCount)
    
       Set db = CurrentDb
    
       Dim i As Long
       For i = 0 To MaxRsCount
          Set rs(i) = OpenTestRecordset(db)
       Next
    
    End Sub
    
    Private Function OpenTestRecordset(ByVal db As DAO.Database) As DAO.Recordset
       Set OpenTestRecordset = db.OpenRecordset("select * from Tab1")
    End Function

    => Hier war nach 332 Recordsets schluss ... allerdings mit einer anderen Fehlermeldung: Nr. 3035, "Nicht genügend Systemressourcen."

    mfg
    Josef


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

    Montag, 26. März 2012 20:37

Alle Antworten

  • Ich beantworte/ergänze meine Frage mit folgendem Zusatz:

    Ich habe meine Anwendung mit viel "Hingabe" auf nun 125 in Formular-Instanzen darstellbare DS "gedopt", indem ich diese (testhalber) aus nur einer zugrundeliegenden Tabelle abfrage bzw. generiere. Hier scheint nun endgültig die Grenze zu sein, ich erhalte folgende Fehlermeldung: "Laufzeitfehler '3000' - Reservierter Fehler (-1104); es gibt keine Meldung für diesen Fehler." Mein praktisches Problem ist mit 125 Instanzen grundsätzlich gelöst, interessehalber bleibe ich aber bei meiner Frage zu einer möglichst kompletten Liste der Laufzeitfehler in VB bzw. Access 2003.
    Montag, 26. März 2012 19:55
  • Hallo!

    Die Fehlermeldung "Mehr Datenbanken können nicht geöffnet werden" kann von zu vielen offenen Recordsets bzw. Database-Referenzen kommen. (Auf Recordsets der Kombinationsfelder u. ä. nicht vergessen.)

    Beispiel zum Testen:

    Private Sub test()
    
       Const MaxRsCount As Long = 500
    
       Dim rs() As DAO.Recordset
       ReDim rs(MaxRsCount)
    
       Dim i As Long
       For i = 0 To MaxRsCount
          Set rs(i) = OpenTestRecordset()
       Next
    
    End Sub
    
    Private Function OpenTestRecordset() As DAO.Recordset
       Set OpenTestRecordset = CurrentDb.OpenRecordset("select * from Tab1")
    End Function

    => Bei meinem Test war bei 252 Recordset schluss.

    Variante, die mehr erlaubt:

    Private Sub test()
    
       Const MaxRsCount As Long = 500
       Dim db As DAO.Database
       Dim rs() As DAO.Recordset
       ReDim rs(MaxRsCount)
    
       Set db = CurrentDb
    
       Dim i As Long
       For i = 0 To MaxRsCount
          Set rs(i) = OpenTestRecordset(db)
       Next
    
    End Sub
    
    Private Function OpenTestRecordset(ByVal db As DAO.Database) As DAO.Recordset
       Set OpenTestRecordset = db.OpenRecordset("select * from Tab1")
    End Function

    => Hier war nach 332 Recordsets schluss ... allerdings mit einer anderen Fehlermeldung: Nr. 3035, "Nicht genügend Systemressourcen."

    mfg
    Josef


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

    Montag, 26. März 2012 20:37
  • Hallo Josef,
    Vielen Dank für die Mühe, mit 332 RS's bist Du mir auf jeden Fall um Längen voraus, tatsächlich schint es genau daran zu liegen... Mal sehen, ob ich die Herausforderung annehme und versuche, die Marke 332 zu toppen, allerdings wird es für meine Zwecke dann unübersichtlich... Auf jeden Fall war das hilfreich!

    Gruß Stefan

    Montag, 26. März 2012 22:46
  • Hallo!

    Falls du noch mehr Recordsets öffnen willst:

    Private Sub test()
    
       Const MaxRsCount As Long = 10000
    
       Dim rs() As ADODB.Recordset
       ReDim rs(MaxRsCount)
    
       Dim i As Long
       For i = 0 To MaxRsCount
          Set rs(i) = OpenTestRecordset(i)
       Next
       Debug.Print MaxRsCount & " ungebundene Recordsets sind nun offen"
       'Aufräumen, da es nun zu keinem Laufzeitfehler wegen zuvielen DB bzw. Systemressourcen kommt
       For i = 0 To MaxRsCount
          rs(i).Close
       Next
       Debug.Print "aufgeräumt"
    
    End Sub
    
    Private Function OpenTestRecordset(ByVal FilterId As Long) As ADODB.Recordset
       Dim rs As ADODB.Recordset
       Set rs = New ADODB.Recordset
       rs.CursorLocation = adUseClient
       rs.Open "select * from Tab1 where ID=" & FilterId, CurrentProject.Connection
       Set rs.activeConnection = Nothing
       Set OpenTestRecordset = rs
    End Function

    Grund, warum das funktioniert: nach dem Öffnen des Recordsets wird die Datenverbindung gekappt und somit keine DB-Instanz belastet. Das funktioniert allerdings nur bei ADODB-Recordsets, welche man aber ebenso als Formulardatenquelle verwenden kann.

    Wenn man später die geänderten Daten vom Recordset wieder in die DB schreiben will oder die vorhandenen Daten per Requery aktualisieren will, muss zuvor die Verbindung wieder hergestellt werden.

    Anm.: CurrentProject.Connection würde ich im Produktiveinsatz durch einen Prozedur-Einsatz (ähnlich "CurrentDbC" von Michael Kaplan) ersetzen.

    mfg
    Josef


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


    Dienstag, 27. März 2012 08:18
  • Wow! Das nenne ich Hingabe. Ich werde (aus Termingründen) eine Weile brauchen, die Vorschläge nachzuvollziehen. Tatsächlich scheint mir aber gerade Dein letzter Vorschlag ganz neue Impulse zu liefern, weil es mir um die Möglichkeit der Darstellung und des Zugriffs geht. Datenänderung erfolgt dann ggf. an anderer Stelle, so daß ich die Verbindung RS/DB nicht unbedingt wieder herstellen muß. Ich gebe gelegentlich nochmals Feedback.

    Vielen Dank!

    Stefan

    Mittwoch, 28. März 2012 09:50