(Q) I'm getting "Error 3014 - Can't Open Any More Tables." What
can I do to solve it.
(A) The best solution is to download and install the Jet 3.5 Update:
Download
Jet35Upd.Exe (SP3)
This doubles the number of "table references" from 1024 to 2048 and will make
a tremendous difference.
If you want to know more about this error, read on. BTW, this is all from Jet 3.5
documentation, I don't know about prior versions.
Error 3014 is a Jet error, not an Access error. Although the message refers to opening
"tables," the error is only roughly related to the actual number of Access
tables you have open. They are, instead, referring to Jet Table References. Unfortunately,
there is no good documentation describing the frequency and quantity of Jet's use of these
references. In short, you never can determine when you're going to hit this error until
you do.
You are allowed 1024 (2048 w/Jet upgrade) of these references. It is a fixed limit and
has nothing to do with available memory. Beefing up the machine will not help. I have
noticed that if memory is scarce (for example, other applications are active) you will not
get the Jet error message, you will get the "MS Access has performed an illegal
operation" message and Access will shut down.
Here are 4 things that definitely impact the number of table references - before
replication enters the picture:
1. Open forms. The more tables a form's (or subform's) record source query uses, the
more table references are used. The more subforms appearing on a main form, the more table
references used - even if they are not visible. One trick is to only assign a recordsource
to a subform if the subform will be viewed (ex. if you use tabs, set the record source
OnClick of the tab). Requeries impact the number of references.
2. List and combo boxes - eat up table references while the form is open.
3. Open recordset objects. Explicitly close them as soon as you are done.
4. Functions which use recordsets. Example - I had a function which opened a table
recordset to pull the one field of the one record in that table (stored a date parameter).
It closed the recordset as soon as the value was read. I was calling this functions in
many queries for subforms and pop-up forms. I found I gained the ability to have many,
many more table references when I called the function only on my start up form and then
referenced that form field everywhere else.
Then replication comes into the picture. I have found no documentation regarding this
subject, but an application for which the table reference limit had been worked around to
perfection suddenly hit the limit much sooner when the back end tables became replicas
instead of "plain" data tables. I can only assume that Jet keeps open a bunch of
table references in order to manage the replication process (i.e., determining when a
record has changed, etc.)
Granted, this isn't definitive, but I do know from many hours of tweaking that working
on items 1 - 4 above will impact when you get the message.
Again, upgrading Jet makes the biggest difference of all!
|