kann nur 84 Recordsets öffnen trotz angeblich 2048 verfügbarer Table-IDs

09/10/2007 - 17:00 von Matthias Popp | Report spam
Hallo NewsGroup,

ich kann maximal 252 Recordsets auf lokale Tabellen und maximal 84
Recordsets auf verknüpfte Tabellen öffnen.
Die MDB müsste jedoch auf eine höhere Anzahl von Ressourcen gleichzeitig
zugreifen können.

Die Applikation besteht aus vielen, zum Teil aufwendigen Formularen, die
zahlreiche Combo-Boxen aufweisen. Diese Formulare rufen sich über
Schaltflàchen gegenseitig auf und sollen nach Möglichkeit geöffnet bleiben,
damit man nach Bearbeitung eines abhàngigen Formulars wieder auf das
Ausgangsformular zurück kommt.
Leider hàngt sich die Anwendung oft mit oder ohne Fehlermeldung auf, weil
anscheinend die Table-IDs ausgeschöpft sind.
Meine Recherchen ergeben, dass Access 2048 dieser IDs bereit stellen müsste.
Wenn ich aber nachzàhle, wie viele IDs meine Formulare verbrauchen, dann
komme ich nie und nimmer auf diese hohe Zahl, sondern habe den Eindruck,
dass bei Access viel früher die Luft ausgeht. Leider habe ich noch keine
Möglichkeit gefunden qualifiziert mit dieser Problematik umzugehen um
dadurch ausgelöste Fehlersituationen zu vermeiden.

Systemumgebung:
Windows Server 2003, Service Pack 2 mit Microsoft Access 2003, Service Pack
3
Die gleiche Problematik konnte ich auf allen Windows 2000 und XP Plattformen
und allen Office 2000, XP und 2003 Varianten feststellen.
Office 2007 konnte ich diesbezüglich noch nicht prüfen.

Kleines Programm, um das Problem nachzuvollziehen:
Dazu ist eine neue MDB anzulegen, darin eine Tabelle mit dem Namen "Test"
beliebigen Aufbaus (ein Feld genügt) zu erstellen und ein Modul anzulegen,
welches die folgende Funktion enthàlt:

Function CheckFreeTableIDs(Optional CheckAnz As Long = 2048) As Long
Dim RS(1024) As DAO.Recordset
Dim i As Long
Dim ErrNr As Long

' Analyse des TableID Verbrauchs
On Error Resume Next
i = 1
Do While ErrNr = 0 And i <= CheckAnz
Set RS(i) = CurrentDb.OpenRecordset("Select * from Test;")
If Err = 0 Then
i = i + 1
ElseIf Err = 3048 Or Err = 3014 Then
ErrNr = Err
Debug.Print "freie Recordsets " & Msg & ": " & i - 1
Else
ErrNr = Err
MsgBox ("Status=" & Err & vbCr & Error & vbCr & "In
CheckFreeTableIDs")
End If
Loop
On Error GoTo 0
CheckFreeTableIDs = i - 1
' probehalber geöffnete Recordsets wieder schließen
For i = CheckFreeTableIDs To 1 Step -1
Call RS(i).Close
Next
End Function

Dieses wird vom Debug-Fenster aus durch Eingabe von: CheckFreeTableIDs
<Enter> aufgerufen.
Mit der lokal definierten Tabelle kann ich 252 Recordsets öffnen,
mit einer verknüpften Tabelle nur noch 84.
Wenn die Funktion in eine MDB eingebaut wird, in der eine Reihe von
Formularen geöffnet sind, dann geht die Anzahl dramatisch zurück.
Mir leuchtet nicht ein, wie diese Table-IDs verbraucht werden und wie viele
in meinem Access explizit zur Verfügung stehen.

Gruß, Matthias
 

Lesen sie die antworten

#1 Thomas Möller
09/10/2007 - 18:30 | Warnen spam
Hallo Matthias,

Matthias Popp schrieb:
ich kann maximal 252 Recordsets auf lokale Tabellen und maximal 84
Recordsets auf verknüpfte Tabellen öffnen.
Die MDB müsste jedoch auf eine höhere Anzahl von Ressourcen
gleichzeitig zugreifen können.

Die Applikation besteht aus vielen, zum Teil aufwendigen Formularen,
die zahlreiche Combo-Boxen aufweisen. Diese Formulare rufen sich über
Schaltflàchen gegenseitig auf und sollen nach Möglichkeit geöffnet
bleiben, damit man nach Bearbeitung eines abhàngigen Formulars wieder
auf das Ausgangsformular zurück kommt.
Leider hàngt sich die Anwendung oft mit oder ohne Fehlermeldung auf,
weil anscheinend die Table-IDs ausgeschöpft sind.
Meine Recherchen ergeben, dass Access 2048 dieser IDs bereit stellen
müsste. Wenn ich aber nachzàhle, wie viele IDs meine Formulare
verbrauchen, dann komme ich nie und nimmer auf diese hohe Zahl,
sondern habe den Eindruck, dass bei Access viel früher die Luft
ausgeht. Leider habe ich noch keine Möglichkeit gefunden qualifiziert
mit dieser Problematik umzugehen um dadurch ausgelöste
Fehlersituationen zu vermeiden.
Systemumgebung:
Windows Server 2003, Service Pack 2 mit Microsoft Access 2003,
Service Pack 3
Die gleiche Problematik konnte ich auf allen Windows 2000 und XP
Plattformen und allen Office 2000, XP und 2003 Varianten feststellen.
Office 2007 konnte ich diesbezüglich noch nicht prüfen.

Kleines Programm, um das Problem nachzuvollziehen:
Dazu ist eine neue MDB anzulegen, darin eine Tabelle mit dem Namen
"Test" beliebigen Aufbaus (ein Feld genügt) zu erstellen und ein
Modul anzulegen, welches die folgende Funktion enthàlt:

Function CheckFreeTableIDs(Optional CheckAnz As Long = 2048) As Long
Dim RS(1024) As DAO.Recordset
Dim i As Long
Dim ErrNr As Long

' Analyse des TableID Verbrauchs
On Error Resume Next
i = 1
Do While ErrNr = 0 And i <= CheckAnz
Set RS(i) = CurrentDb.OpenRecordset("Select * from Test;")
If Err = 0 Then
i = i + 1
ElseIf Err = 3048 Or Err = 3014 Then
ErrNr = Err
Debug.Print "freie Recordsets " & Msg & ": " & i - 1
Else
ErrNr = Err
MsgBox ("Status=" & Err & vbCr & Error & vbCr & "In
CheckFreeTableIDs")
End If
Loop
On Error GoTo 0
CheckFreeTableIDs = i - 1
' probehalber geöffnete Recordsets wieder schließen
For i = CheckFreeTableIDs To 1 Step -1
Call RS(i).Close
Next
End Function



Schau Dir mal diesen Beitrag von Jens nàher an:
http://groups.google.com/group/micr...d82db567b2
(Link in einer Zeile)

IMHO ist in Deinem Code die Verwendung von CurrentDb das Problem. Was
passiert, wenn Du eine Variable vom Typ Database deklarierst und nur
einmal instanzierst?

Dim db As DAO.Database

Set db = CurrentDb()

'Dein Code

Set db = Nothing



HTH
Thomas

Homepage: www.Team-Moeller.de

Ähnliche fragen