Access 2003 Laufzeitfehler 3048 - Formularinstanzen
-
lunes, 26 de marzo de 2012 11:14
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
Todas las respuestas
-
lunes, 26 de marzo de 2012 19:55Ich 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. -
lunes, 26 de marzo de 2012 20:37
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
JosefCode-Bibliothek für Access-Entwickler
AccUnit - Testen von Access-Anwendungen
Virtueller Access-Stammtisch- Marcado como respuesta Stefan-G. Albers lunes, 26 de marzo de 2012 22:46
-
lunes, 26 de marzo de 2012 22:46
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
-
martes, 27 de marzo de 2012 8:18
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 FunctionGrund, 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- Editado Josef PötzlMVP martes, 27 de marzo de 2012 8:23
-
miércoles, 28 de marzo de 2012 9:50
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

