I found this posted in many newsgroups so I thought it was worthy of a page at vb123.com. Garry Robinson - Editor of Vb123.com
Is Your Database Corrupt ?
Click here to find out what we do with our corrupt databases...
Garry Robinson - Editor vb123.com
The following information (long!) should help answer a number of
questions an concerns you have about database corruption.
Database Corruption Causes:
Database corruption does not follow a "typical" scenario. There are,
however, some virtually guaranteed ways to corrupt an MDB. If you power
down your PC or "crash" your PC, or, in the case of server-based databases
(including peer-to-peer systems) crash the network server or drop the
network connection, it's almost a guarantee.
When the Netware servers are out of space Netware may purge caches prior to
writing the data, which can corrupt open Access files. If you leave a
server based Access application open on the workstation and the server
administrator "kicks you off the net" and reboots the server, most likely
your MDB is corrupt.
If you are using Terminal Server and the users disconnect, rather then log
off the server, corruption could occur when the server is shut down. This
is similar to pulling the power plug on your computer while you still have
applications running as an orderly shutdown of the applications does not
occur until the log off process is completed.
Sometimes we try to open a database file from an external (removable) media
such as a diskette, CD, or ZIP type media. Due to the need for additional
disk space for the LDB file and file expansion, opening database files from
this type of removable media is prone to disk space errors, unavailability,
and is, in general, not as reliable a storage media as a hard disk.
Whenever possible, copy the file to the hard drive and process the file
from there. When you are finished, copy the file back to the removable
Because Microsoft Jet is a file sharing database system, when using
Microsoft Jet in a multi-user situation, multiple client processes are
using file read, write, and locking operations on a shared file. Because
multiple client processes read and write to the same file and Jet does not
use a transaction log like more advanced database systems such as SQL
Server, it is not possible to reliably prevent database corruption. If you
want a reliable 24x7 database system, Microsoft recommends using a true
client server database system that supports durable transactions like
Microsoft SQL Server.
Opening and Saving the MDB File in Another Program:
There is no way to recover a .mdb file that was opened and then saved in a
program other than Access. For example, Microsoft Word allows you to open
an Access database and then save it (although it serves no good purpose to
do so because if you open an MDB file in another program, all you can see
are extended characters). Saving the file in this manner will cause the
.mdb file to prompt you for a database password when you try to open it in
Access even though the file may have never been password-protected in
Access. The password prompt occurs in such cases because the first byte
range that Access checks when it opens a file is where the database
password would be. If that byte contains corrupted data, Access treats the
file as being password protected. Even if there were a way to get around
the password prompt in this case, the database would still be unrecoverable
because the binary structure is scrambled and therefore unreadable to
Access. Recovering a backup copy of the file is the only solution in this
case. For additional information about this issue, click the article number
below to view the article in the Microsoft Knowledge Base:
Q223043 ACC: Database Password Appears Even Though It Was Never Set
In Access 97, data corruption can occur when concurrently appending data
from multiple instances of Microsoft Access to the end of a Memo field.
Once corrupted, the field displays a "#deleted" symbol and further attempts
to access the field will produce the following error:
"The Microsoft Jet database engine stopped the process because you and
another user are attempting to change the same data at the same time."
Repairing the database incorrectly reports that it completed successfully.
Compacting the database yields the following message:
"Record(s) can't be read; no read permission on '<filename>'."
Data in other fields within the table and record are unaffected. The row
can be deleted, removing the corruption successfully.
To resolve this issue in Access 97, obtain Jet35sp3.exe (Microsoft Jet 3.5
Service Pack 3). To obtain Jet35sp3.exe, please see the following article
in the Microsoft Knowledge Base:
Q172733 - ACC97: Updated Version of Microsoft Jet 3.5 Available
1. The first thing I would do is make a backup copies of the corrupt
database and only try the recovery attempts on one of the backup copies as
any attempt to recover the database could render it useless for future
2. To recover a damaged database file, first try using Compact Database
from the Tools menu, Database Utilities. In the Tools Menu, Options,
General tab, you can select Compact on Close for the currently open
3. When we suspect that the database file may have become damaged, we can
import the contents of that file into a new database. If the problem was
caused by damage to the database structure, this method will frequently
allow us to recover the data and database controls from the original file
into a new database file that functions correctly.
To import an existing database file we first need to create a new blank
database. From the File menu, select New and choose database. At this point
you may want to name the new database file differently from the original so
that the two files have unique names.
From the File menu, choose Get External Data, Import, and select the
original database file. When the file is opened, click the Select All
button on each of the tabs in the Import Objects dialog box. This will
import all of the Tables, Queries, Forms, etc. from the original database
into the new database.
If your database contains custom menus, toolbars, or import/export
specifications, use the Options button to select these items.
If Microsoft Access stops the import at any point, it has probably hit a
damaged database object. You will then need to import the objects in that
group one-by-one, instead of selecting the whole group. Microsoft Access
will not allow damaged objects to be imported into a new database, so you
will need to re-create any objects you are unable to import.
Once the Import is completed you will have a copy of the objects from the
original database in a new database structure and you are ready to use the
This technique is also worth trying when a database file has been converted
from a previous version of Access and does not work as expected.
4. Sometimes a file that does not open on one machine will open on another.
5. Corrupted Form Objects - In Access 97, we can sometimes remove
corruption from a Form by using the undocumented SaveAsText and
LoadFromText Functions. This technique assumes Access 97 is available on
- 1. Open the database in Access 97.
- 2. Press CTRL+G to open the Debug window.
- 3. Type the following line and then press ENTER
SaveAsText acForm, "<FormName>", "<FileName>"
where <FormName> is the name of the form that is corrupt and <FileName> is
the path and name of the text file you want to save to.
- 4. Rename the corrupted form.
- 5. Type the following line and then press ENTER
LoadFromText acForm, "<FormName>", "<FileName>"
where <FormName> is the name you want the form to have and <FileName> is
the path and name of the text file you want to import from.
5. Corrupted VBA Modules - When a Report or Form appears to be corrupt it
may be due to a damaged Class Module associated with the form.
To fix this problem, in original Database open the damaged report in design
view. Open the properties of the report and set the Has Module Property to
No. This will remove this corrupt Module from the project. The Has Module
Property is located at the bottom of the "Other" tab on the properties
dialog. Close and save the report.
If the corruption involves being unable to open the class module of a form
or a report, or the design view of a module, you may want to try the
/decompile command line switch. It is strongly recommended that we make a
back-up copy of the database before attempting this method. The following
is a sample command with the /decompile switch, wherein MSAccess.exe is in
its default location and the database DB1.mdb is in the C:\ folder:
"C:\Program Files\Microsoft Office\Office\MSAccess.exe /decompile
C:\DB1.mdb" (without the quotation marks)
After running this command from the Run box, you are prompted to compile
the database after using /decompile.
6. Access 2000 VBA Modules - If we get an Invalid Page Fault when we try to
open a class module, we can try to clear up the corruption by exporting and
then importing the problem module as detailed in the following steps:
- 1. Open the database.
- 2. In the Database window, click Modules, and then click New. The Visual
Basic Editor starts.
- 3. If the Project window is not visible, click Project Window on the
- 4. In the Project window, click Class Modules. A list of the class
- 5. Right-click the problem module, and then click Remove <module name>.
- 6. You are asked to export before removing the module. Click Yes.
- 7. In the Export File dialog box, click the "Save in" box, and then
click Desktop. Click Save.
- 8. On the File menu of the Visual Basic Editor, click Import File
- 9. In the Import File dialog box, click the file that you just exported,
and then click Open.
- 10. On the File menu, click Save <database name>.
- 11. On the File menu, click "Close and Return to Microsoft Access".
- 12. Try opening the module in Design view. The module should open
For additional information on this issue, please see article:
Q248970 - ACC2000: Invalid Page Fault When You Try to Open Class Module
If the preceding steps don't work because you cannot create a new module,
there are a couple of things we can attempt to try from the VBE Immediate
- 1. Use VBE's Export method to export the class module programmatically.
From the immediate window, execute this line:
- 2. Try using Access's SaveAsText method. From the immediate window,
execute this line:
In some cases, a VBA Module becomes corrupt in such a way that the module
cannot be located in the database window or deleted from the database.
If this should occur, open the VBA editor from the database window
(alt-F11) and select the module in the Project Explorer. We can now Export
the module by clicking on File, Export Module. Make a note of where we
export the module.
We can now Close this database and create a new one. Import all the objects
from the original database expect for the offending Module.
Note: we may receive errors for the linked tables if they cannot be found
during the importing.
In the new database, open the VBA Editor from the database window (Alt -
F11), Import the module we previously exported, and save it by selecting
Save Project from the file menu.
These steps should remove any corruption from the VBA project in the new
database. In addition, it will remove the module that could not be
deleted, and should allow us to see the new module in the database window.
7. There is sample code in the JET35SP3.exe ReadMe File, which can be
modified to apply to both Access 97 and Access 2000. This code provides the
possibility to SOMETIMES recover some, if not all data in the database
tables. To obtain this code, please see the following articles:
Q182867 ACC: Jet Database Engine 3.x Error Messages Due to Corruption
8. Table Corruption - Sometimes we can extract table data when we cannot
open the database file by importing the Access table data into in
intermediary application like Excel, and then import the data from Excel
into Access. In the following steps we are using MS Query in Excel to
recover data corrupted database file:
- 1. Select Data\Get External Data.
- 2. Choose New Database Query.
- 3. At the Choose Data Source window, select Microsoft Access Database
and click OK.
- 4. At the Select Database window, browse to the .MDB file.
- 5. At the Query Wizard window, select the table and columns.
- 6. A filter or a sort is not necessary, just click on Next and then on
- 7. If the data can be read, it will display in the Microsoft Query
9. Troubleshooting Tools - There are methods we can use to determine which
users and/or workstations are causing JET to mark a database as suspect:
When JET begins a write operation, it sets a flag, and resets the flag when
the operation is complete. If a write operation is interrupted (such as
with a power or network failure, the flag remains set. When you reopen the
database, JET determines that the flag is set and reports the database as
corrupt. In these cases, compacting and/or repairing the database can
typically restore the database.
In JET 4.0 you can use the JET UserRoster utility to determine which
users/workstations may be causing the problem. The UserRoster utility which
is available as a VBA code sample in Knowledge Base Article:
Q198755 ACC2000: Checking Who Logged into Database with Jet UserRoster
10. Repairing Databases - You might want to review the Knowledge Base
articles on repairing a database file:
Q109953: How to Repair a Damaged Database File
Q279334 - ACC97: How to Repair a Damaged Jet 3.5 Database
Q209137 - ACC2000: How to Troubleshoot/Repair a Damaged Jet 4.0 Database
11. Other Recovery Options - PK Solutions is a Third-Party organization
that specializes in providing Access applications and recovery of damaged
Access database files. They are available on the Internet at:
This response contains a reference to a third party World Wide Web site.
You should know that third party sites are not under the control of
Microsoft. Accordingly, Microsoft can make no representation concerning
the content of these sites. Microsoft is providing this information only
as a convenience to you: this is to inform you that Microsoft has not
tested any software or information found on these sites and therefore
cannot make any representations regarding the quality, safety, or
suitability of any software or information found there. There are inherent
dangers in the use of any software found on the Internet, and Microsoft
cautions you to make sure that you completely understand the risk before
retrieving any software on the Internet.
12. If all else fails our only option may be to use a backup copy of the
database or recreate the database from the original source documents.
Here are several precautions that we recommended to reduce the risk of
1. Avoid power loss during database writes, which can cause the database to
be left in a suspect state.
2. Avoid dropping network connections.
3. Avoid abnormal termination of Microsoft Jet. Examples include: Power
Loss, Rebooting, or using Task Manager to shutdown the application, etc.
4. When programming close all DAO objects that you open. Examples include
Recordset, QueryDef, TableDef, and Database objects.
5. Do not run IPX on NT 3.51 Server where Jet databases are located across
the network and the client is Win95 with IPX/SPX. Instead run TCP-IP on the
NT Server and a dual protocol stack of IPX and TCP-IP on the Win95 client.
(NT to NT with IPX/SPX will not cause the problem, nor will Novell to any
6. Avoid large number of Open/Close operations in a loop (over
approximately 40,000 successive operations).
7. Compacting the Database File - Here is a list of the benefits of running
Note: It's highly recommended that databases are compacted often, daily if
- Reclaims disk space created by object and record deletions. When objects
or records are deleted from the database, the space they occupied is marked
as available for new additions to the database. However, the size of the
database never shrinks unless the database is compacted.
- Reorganizes a table's pages so they reside in adjacent database pages.
This improves performance because the table data is sequential, allowing
for better use of the read ahead cache.
- Resets incrementing AutoNumber fields so the next value allocated will be
one more than the highest value in the remaining records.
- Regenerates the table statistics for the indices, which the Query
optimizer depends heavily on these for optimal query plans. These
statistics can become out-of-date over time, typically if transactions were
rolled back, or if the database was abnormally terminated.
- Flags all queries so that they will be recompiled the next time the query
is executed. This is important because database statistics can change and a
previously compiled query may have an inaccurate query plan. For example a
database may greatly increase or decrease in size.
In addition to compacting the database on a regular basis, the most current
update of JET 4.0 contains modifications to help reduce database size and
is available for download by referencing article:
Q239114 - ACC2000: Updated Version of Microsoft Jet 4.0 Available
8. Compacting the Workgroup File:
To Compact or Repair the System.mdw workgroup file, I would first make a
copy of the file to a different folder on the hard drive. Open Access and
from the File Menu, Open, select Files of Type as Workgroup Files and
navigate to the copy of the System.mdw you just made.
The default location for the System.mdw file is:
Access 2000 - C:\Program Files\Microsoft Office\Office
Access 97 - C:\Windows\System <or> C:\WINNT\System32
Access 95 - C:\Msoffice\Office
When you open the file, you may get messages indicating that some of the
system file will be read only.
From the Tools Menu, Database Utilities, select Compact Database or Repair
Database. Unless you get errors, I would then use the Workgroup
Administrator (Wrkgadm.exe) to temporarily connect to the new file and test
thoroughly. If this resolves your problem, then rename the original
System.mdw to System.old as a backup and copy the new file to the location
where the original file was located and use the Workgroup Administrator to
connect to the new file back in the original location.
8. Obtain the latest application product updates - JET, MDAC, Office and
Access 97 - The Microsoft Jet Database Engine version 3.51 provides an
improved Compact utility that combines Compact and Repair into a single
process. The Jet database engine now generates an error if it encounters a
problem during the Compact process and then creates the MSysCompactError
table in the destination database. The Readme file includes sample code
that allows you to easily view rows of data in which the Jet database
engine found problems during the Compact process.
For information on how to obtain the latest version of JET, please see
Q172733 - Updated Version of Microsoft Jet 3.5 Available for Download
For the newest revision of the JET Engine for Access 97, the Access 97 SR-2
update is needed. Please see Article:
Q194377 - OFF97: Overview of the Updated Microsoft Office 97 SR-2 Patch
This article addresses how to upgrade Office to the SR-2 release. The
article includes a brief history of Microsoft Office 97 SR-2 and discuses
the Microsoft Office 97 Version Checker utility that analyzes your computer
and recommends a course of action to complete the upgrade to SR-2.
Information on how to obtain the SR-2 update is available in Article:
Q151261 - OFF97: How to Obtain and Install MS Office 97 SR-2
Access 2000 - The most current update of JET 4.0 contains modifications to
help reduce database bloat and is available for download by referencing
Q239114 - ACC2000: Updated Version of Microsoft Jet 4.0 Available
The most current version (2.6) of Microsoft Data Access Components (MDAC)
is available for download by referencing the Internet at:
The most current version of Office 2000 is the SR-1 Update with SP-2. For
additional information on other changes made by this update and how to
obtain the update, please see the following articles:
Q245021 OFF2000: List of Fixed Problems in Microsoft Office 2000 SR-1
Q245025 OFF2000: How to Obtain and Install Microsoft Office 2000 SR-1
Q278942 OFF2000: What Is Office 2000 Service Pack 2 (SP-2)
Q278269 OFF2000: How to Obtain and Install Office 2000 Service Pack 2
To verify that we have a valid installation of the MDAC files we can use
the MDAC Component Checker by referencing article:
Q231383 INFO: Component Checker: Diagnose and Reconfigure MDAC Installs
For the SR-1 version of MOD Runtime Access please see:
Q253566 MOD2000: How to Obtain and Install MOD 2000 SR-1
10. File Server Networking - When sharing a Microsoft Jet database file on
a network file server it is recommended that we disable opportunistic
locking (oplocks) on the network file server.
Microsoft has recently discovered an issue where opportunistic locking can
increase the chances of database corruption when a Microsoft Jet database
is shared by 2 or more clients on a network file server. This issue applies
to Windows NT 4.0, Windows 2000, and Novell file servers that support
opportunistic locking. This issue is still under investigation.
To disable opportunistic locking on a Windows NT 4.0 or Windows 2000 file
locate the following registry key on the network file server:
(Note HKLM here stands for HKEY_LOCAL_MACHINE)
Under this key create a new DWORD value named EnableOplocks and set it's
value to 0 to disable opportunistic locking. Re-boot the network file
server to insure that the setting is honored.
11. Avoid using any Windows 2000 clients sharing a Microsoft Access
database file stored on a Windows 95/98 file share. When you have a mixture
of machines on a network with some machines having Windows 2000 and some
machines having Windows 95/98 and you need to share the database with other
network users, the recommendation from Microsoft is to store and share the
database file from a Windows NT or Windows 2000 server with opportunistic
locking disabled. Having Windows 2000 client machines, even with
opportunistic locking disabled, sharing a file stored on a Windows 95/98
file share can potentially cause corruption. This issue is still under
investigation and further information will be posted to this article when
it becomes available.
12. Ensure you have a robust file server that is dedicated to sharing the
Microsoft Jet database file (and not also acting as a Windows Domain
Controller, Exchange Server, SQL Server, etc...).
The reason for this recommendation is a network administrator may re-boot
the machine to fix a problem with another deemed more important service
(such as the mail server), or re-boot after applying a hotfix or service
pack, and forget that your Microsoft Jet database is currently shared on
the server. This will cause unexpected interruption of the client
connections to the database, possibly causing database corruption.
Likewise, a robust file server should be placed in a secured location where
it cannot be accidentally switched off. The server should have a UPS to
protect it from intermittent power outages or power fluctuations. Likewise
the network file server should have high performance hard drives, a good
network card, and plenty of RAM to insure that the server is not overly
taxed by the load placed on it.
13. Ensure you have a stable and fast network, and good solid network
connectivity to the network file server.
14. Avoid using Microsoft Jet over a WAN, modem connection, ftp (or any
other less than reliable network transport). Since Microsoft Jet is a file
sharing database system, any less than reliable network transport increases
the chances of a dropped client, which in turn increases the chance of
15. Ensure that the network file server has the latest operating system
service pack installed.
Installing the latest operating system service pack on the network file
server ensures that you have the latest bug fixes for the network
redirector and file system.
16. Backup your Microsoft Jet database file on a regular basis. Note that
you will need to shut down all Microsoft Jet clients before backing up the
Microsoft Access database file, failure to do so may result in the backup
file having inconsistent data. Choose a backup schedule that corresponds to
the most amount of data you can afford to lose. For example, if you can't
afford to lose more than a days worth of data, backup on a daily basis. If
you can afford losing a weeks worth of data, backup weekly, etc... A full
database file backup is the only guaranteed means of insuring that you can
recover your Microsoft Jet database file when corruption occurs.
17. Application Design - can play into this in a significant way depending
on the nature of your application. Microsoft Technical Support does not
get deeply involved in design recommendations as this is, by necessity,
predominantly a consulting situation to assist with your specific
application. Consulting, including in-depth instruction on how to use a
product, how to develop custom code, or how to design and normalize a
database is a service offered by Solution Providers outside of Microsoft.
You can call (800) SOL-PROV for more information about the Solution
Provider Program. Additionally, Microsoft Consulting Services can be
reached at (800)922-9446.
18. Minimize the number of connections made to the Jet database from each
client. If possible, design each client to use one and only one connection
to the Microsoft Jet database. Each connection to a Jet database represents
an independent client to the database, even when these connections come
from the same client process. To optimize performance, network i/o and
reduce the multi-user stress on the back-end database, design the client
application to use a single connection to the Jet database and share this
connection over multiple recordsets as needed. This has the added benefit
of preventing write/read delays inside the client application. By default,
there is a 5 second delay (see PageTimeout topics in the Microsoft Jet
Database Engine Programmer's Guide) between writing a value to the database
and being able to read this updated value when writing and reading on 2
different Jet connections, even if the 2 connections reside in the same
client process. Using a single connection avoids this issue.
19. Use a matching format Jet database for the version of the Jet engine
used. For the best performance and stability, use a Microsoft Jet 4.0
format database when using Microsoft Jet 4.0 clients. Likewise, use a
Microsoft Jet 3.0 format database when using Microsoft Jet 3.5 clients.
Here is a table of the currently available Jet formats and what translator
dll is used (if any) to talk to this format when using a Microsoft Jet 4.0
Access Version Jet Format Translator Dll Used
-------------- ---------- -------------------
Access 2.0 Jet 2.0 msrd2x40.dll
Access 95 Jet 3.0 msrd3x40.dll
Access 97 Jet 3.0 msrd3x40.dll
Access 2000 Jet 4.0 None
Access XP Jet 4.0 None
So we can see from this chart that Microsoft Access 95 and Access 97 create
a Microsoft Jet 3.0 format database file. Likewise, Access 2000 and Access
XP create a Microsoft Jet 4.0 format database file. When you are using a
Microsoft Jet 4.0 client, you want to use a Microsoft Jet 4.0 database
format file to avoid the use of a translator dll. Also, if you are using a
Microsoft Jet 3.5 client, you should try to use a Microsoft Jet 3.0 format
Here is a list of common used Microsoft Jet database engine clients and
what associated Jet engine version they utilize:
Client Application Jet Engine Used Recommended Jet DB Format
------------------------ ------------------- -------------------------
Access 2.0 Jet 2.0 Jet 2.0
Access 95 Jet 3.0 Jet 3.0
Access 97 Jet 3.5 Jet 3.0
Access 2000 Jet 4.0 Jet 4.0
Access XP Jet 4.0 Jet 4.0
DAO 3.0 Jet 3.0 Jet 3.0
DAO 3.5 Jet 3.5 Jet 3.0
DA0 3.6 Jet 4.0 Jet 4.0
Microsoft.JET.OLEDB.3.51 Jet 3.5 Jet 3.0
Microsoft.Jet.OLEDB.4.0 Jet 4.0 Jet 4.0
Access ODBC Driver* Jet 4.0 Jet 4.0
* Note that the Microsoft Access ODBC driver that ships with MDAC 2.1 and
MDAC 2.5 uses Microsoft Jet 4.0. The Microsoft Access ODBC driver that
ships with MDAC 2.0 or older versions of MDAC uses Microsoft Jet 3.5. MDAC
2.6 and later versions do not ship the Microsoft Access ODBC driver at all.
In certain situations (for example when you have both older and newer Jet
applications sharing the same database file) you may not be able to use the
latest format Jet database file. This is because older Jet engines cannot
read or write to a newer Jet format database files. In this case you have
no choice but to use the older format and use the translator dlls.
20. When accessing a Microsoft Access database from ADO, Microsoft
recommends that you use the Microsoft Jet OLEDB Provider rather than the
Microsoft Access ODBC driver. For more information on this topic, see the
following knowledgebase article:
Q222135 - ACC97: Using Microsoft Jet with IIS
Note that this article applies to both Jet 3.5 and Jet 4.0.
One Final Note:
Another service is the Microsoft Office Developer Consulting Line, which is
available for customers who need development assistance using Microsoft
Office products. The cost is $210/hour. You can reach the Microsoft
Office Developer Consulting Line by calling (800) 936-5200.
Microsoft Jet Database Engine Programmer's Guide
Q200300 - HOWTO: Synchronize Writes and Reads with the Jet OLE DB
Q209137 - ACC2000: How to Troubleshoot/Repair a Damaged Jet 4.0 Database
Q109953 - ACC: How to Troubleshoot/Repair Damaged Jet 3.0 and Prior Datab
Q296264 - Configuring Opportunistic Locking in Windows 2000
Q129202 - PC Ext: Explanation of Opportunistic Locking on Windows NT
I hope this helps! If you have additional questions on this topic, please
reply to this posting.
Regards, Frank Miller
Also read this vb123.com article
Implementing a Successful Multi-user Access/JET Application
ALSO at other sites
A Good Page To Check For Corruption Issues Is At The Bottom Of
You can download a uncorruption tool at this page
Get Good Help Here
If you need help with a database or Office programming, our Professionals could be the answer because we have worked on many similar solutions
We have converted vb123.com to Expression Web, contact us if we can help you move to the latest Microsoft web tool.
About The Editor ~ Contact Us
Garry Robinson writes for a number of popular computer magazines, is now a book author and has worked on 100+ Access databases. He is based in Sydney, Australia