Simple Fix for Missing DBF Support in Access 2013

Quick fix installers that restore Access 2013 DBF support *PLUS* the techniques I used to build the installers using 7-Zip and Inno Setup.

Simple Fix for Missing DBF Support in Access 2013

Microsoft Access infamously dropped support for the dBASE file format in Access 2013.  The omission created such an uproar that it was reintroduced in Access 2016 and has remained in place ever since.

Now, I realize I am really late to the game in publishing this fix.  Access 2013 is just barely still in support.  But even if you don't need these setup files themselves, the technique I use to create them could come in handy in other situations.


tl; dr: Can I haz teh codez?

If you just want the installers so that you can fix the problem and get on with your day, here they are:

Keep reading for additional background and information about how you can build these same installers from scratch using Inno Setup (it's not that hard!).


What is dBASE?

Here's a description from Microsoft:

dBASE was one of the original database management systems and the dBASE file format (.dbf) has been around for a long time. Microsoft Access supports importing from and linking to the following dBASE file formats: dBASE III, dBASE IV, dBASE 5, and dBASE 7.

On that same page, we see this tidbit about Office (and, by extension, Access) 2013:

Access 2013 doesn't support dBASE

Linking to or importing from dBASE is not supported in Access 2013. To work with dBASE files, consider upgrading to an Microsoft 365 subscription. Linking to or importing from dBASE is available in the Microsoft 365 subscription versions of Access.

The Typical Workarounds

  • Use a different version of Access (preferred)
  • Open the .dbf in Excel, save it in a different format, import that in Access (e.g., here and here)
  • Install the Access 2010 runtime and modify the Windows Registry (e.g., here and here)

For 99.9% of use cases, using a different (newer) version of Access is the obvious solution.  That said, I know there are still lots of Access applications running in Access 2013 for {insert perfectly valid reason here}.  If you are in that situation and you are using the second or third workaround above, then this solution should make your life much easier.

A Better Mousetrap

I used Inno Setup to create a couple of basic setup programs that take all of the guesswork out of the Windows Registry workaround.  In doing so, I also eliminated the need to install the Access 2010 Runtime.

You can scroll to the bottom of this article to download the two executable setup files for 32-bit and 64-bit versions of Access 2013 if you don't care about how I created them.  For the curious, read on.

Eliminating the Access 2010 Runtime Requirement

The Access 2010 Runtimes are 175.5 MB and 212.4 MB for the 32-bit and 64-bit versions, respectively.  That's an awful lot of extra stuff just for dBASE support.  It turns out that we only need two files from those installers:

  • ACEXBE.DLL
  • MSO.DLL

You don't even need to install the runtime on a development machine to get these files, as long as you have the awesome open-source compression utility 7-Zip.

Follow these steps:

  1. Download the x86 (32-bit) installer
  2. Right-click on the downloaded file and choose 7-zip > Open archive
  3. Double-click the AccessRT.cab file inside 7-Zip
  4. Click and drag the ACEXBE.DLL file into a folder named \x86\
  5. Click and drag the MSO.DLL.x86 file into a folder named \x86\ and rename it to MSO.DLL
  6. Repeat steps 1-5 above, replacing "x86" with "x64" for all instructions

Eliminating Manual Registry Entries with Inno Setup

The next step is to create the installers using Inno Setup.  You will need to download a copy of Inno Setup if you want to try this yourself.

Inno Setup installers are defined using configuration files.  I love this about them because it makes it easy to track them within version control.  It also makes it easy to script their creation, so that you can build an install in one click.  

Another thing I like about them is that you can create base template files and include them in application-specific install scripts.  This helps ensure consistency across installers, and it also makes it very easy to create a new installer.  I also use this feature to create individual 32-bit and 64-bit installers, where the vast majority of the setup configuration is in a single base file.

The Inno Setup Base Template File

I use a common base file for both the 32-bit and 64-bit installers.  The following text should be copied and pasted into a file named Access 2013 DBF Support.isi.  

NOTE: The Inno Setup installer does not register the ".isi" file extension, so you will have to choose an application to open the file.  Visual Studio Code and Notepad++ both have syntax highlighting for Inno Setup files, but any text editor (including Notepad.exe) will work.

Access 2013 DBF Support.isi
[ISPP]
#define MyAppName "Access 2013 DBF Support"
#define MyAppVersion "22.1.29.550"
#define MyAppPublisher "Grandjean & Braverman, Inc."
#define MyAppURL "https://www.grandjean.net/"

; These components are installed based on the bitness of Access (not Windows)
#ifdef Access64bit
  #define ACEXBE_DLL ".\64-bit\ACEXBE.DLL"
  #define MSO_DLL ".\64-bit\MSO.DLL"
  #define MyAppName MyAppName + " (64-bit)"
#else
  #define ACEXBE_DLL ".\32-bit\ACEXBE.DLL"
  #define MSO_DLL ".\32-bit\MSO.DLL"
  #define MyAppName MyAppName + " (32-bit)"
#endif

[Setup]
SignTool=GB-SectigoCert {#MyAppName}

#ifdef Access64bit
  ArchitecturesInstallIn64BitMode=x64
  OutputBaseFilename=Access2013dbfSupportSetup64
#else
  OutputBaseFilename=Access2013dbfSupportSetup
#endif


AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
CreateAppDir=no
SetupIconFile=ExportDBase.ico
Compression=lzma
SolidCompression=yes
VersionInfoVersion={#MyAppVersion}
VersionInfoCompany={#MyAppPublisher}
VersionInfoDescription=Provide dBASE IV/5.0 support for Access 2013
VersionInfoProductVersion={#MyAppVersion}

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"

[Files]
Source: {#ACEXBE_DLL}; DestDir: "{commoncf}\Microsoft Shared\OFFICE14"; 
Source: {#MSO_DLL}; DestDir: "{commoncf}\Microsoft Shared\OFFICE14"; 

[Registry]
;Set up the Xbase engine
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\Engines\Xbase"; ValueType: binary; ValueName: "Century"; ValueData: "00"; Flags: createvalueifdoesntexist
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\Engines\Xbase"; ValueType: string; ValueName: "CollatingSequence"; ValueData: "Ascii"; Flags: createvalueifdoesntexist
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\Engines\Xbase"; ValueType: string; ValueName: "DataCodePage"; ValueData: "OEM"; Flags: createvalueifdoesntexist
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\Engines\Xbase"; ValueType: string; ValueName: "Date"; ValueData: "MDY"; Flags: createvalueifdoesntexist
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\Engines\Xbase"; ValueType: binary; ValueName: "DbcsStr"; ValueData: "01"; Flags: createvalueifdoesntexist
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\Engines\Xbase"; ValueType: binary; ValueName: "Deleted"; ValueData: "01"; Flags: createvalueifdoesntexist
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\Engines\Xbase"; ValueType: binary; ValueName: "Exact"; ValueData: "00"; Flags: createvalueifdoesntexist
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\Engines\Xbase"; ValueType: dword; ValueName: "Mark"; ValueData: "0"; Flags: createvalueifdoesntexist
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\Engines\Xbase"; ValueType: binary; ValueName: "NetworkAccess"; ValueData: "01"; Flags: createvalueifdoesntexist
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\Engines\Xbase"; ValueType: dword; ValueName: "PageTimeout"; ValueData: "600"; Flags: createvalueifdoesntexist
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\Engines\Xbase"; ValueType: string; ValueName: "win32"; ValueData: "{commoncf}\microsoft shared\OFFICE14\ACEXBE.DLL"; Flags: createvalueifdoesntexist

;Add the dBASE 5.0 ISAM Format
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\ISAM Formats\dBASE 5.0"; ValueType: binary; ValueName: "CanLink"; ValueData: "01"; Flags: createvalueifdoesntexist
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\ISAM Formats\dBASE 5.0"; ValueType: binary; ValueName: "CreateDBOnExport"; ValueData: "00"; Flags: createvalueifdoesntexist
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\ISAM Formats\dBASE 5.0"; ValueType: string; ValueName: "Engine"; ValueData: "Xbase"; Flags: createvalueifdoesntexist
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\ISAM Formats\dBASE 5.0"; ValueType: string; ValueName: "ExportFilter"; ValueData: "dBASE 5 (*.dbf)"; Flags: createvalueifdoesntexist
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\ISAM Formats\dBASE 5.0"; ValueType: string; ValueName: "ImportFilter"; ValueData: "dBASE 5 (*.dbf)"; Flags: createvalueifdoesntexist
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\ISAM Formats\dBASE 5.0"; ValueType: binary; ValueName: "IndexDialog"; ValueData: "00"; Flags: createvalueifdoesntexist
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\ISAM Formats\dBASE 5.0"; ValueType: dword;  ValueName: "IsamType"; ValueData: "0"; Flags: createvalueifdoesntexist
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\ISAM Formats\dBASE 5.0"; ValueType: binary; ValueName: "OneTablePerFile"; ValueData: "01"; Flags: createvalueifdoesntexist
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\ISAM Formats\dBASE 5.0"; ValueType: binary; ValueName: "SupportsLongNames"; ValueData: "00"; Flags: createvalueifdoesntexist

;Add the dBASE IV ISAM Format
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\ISAM Formats\dBASE IV"; ValueType: binary; ValueName: "CanLink"; ValueData: "01"; Flags: createvalueifdoesntexist
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\ISAM Formats\dBASE IV"; ValueType: binary; ValueName: "CreateDBOnExport"; ValueData: "00"; Flags: createvalueifdoesntexist
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\ISAM Formats\dBASE IV"; ValueType: string; ValueName: "Engine"; ValueData: "Xbase"; Flags: createvalueifdoesntexist
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\ISAM Formats\dBASE IV"; ValueType: string; ValueName: "ExportFilter"; ValueData: "dBASE IV (*.dbf)"; Flags: createvalueifdoesntexist
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\ISAM Formats\dBASE IV"; ValueType: string; ValueName: "ImportFilter"; ValueData: "dBASE IV (*.dbf)"; Flags: createvalueifdoesntexist
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\ISAM Formats\dBASE IV"; ValueType: binary; ValueName: "IndexDialog"; ValueData: "00"; Flags: createvalueifdoesntexist
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\ISAM Formats\dBASE IV"; ValueType: dword;  ValueName: "IsamType"; ValueData: "0"; Flags: createvalueifdoesntexist
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\ISAM Formats\dBASE IV"; ValueType: binary; ValueName: "OneTablePerFile"; ValueData: "01"; Flags: createvalueifdoesntexist
Root: "HKLM"; Subkey: "Software\Microsoft\Office\15.0\Access Connectivity Engine\ISAM Formats\dBASE IV"; ValueType: binary; ValueName: "SupportsLongNames"; ValueData: "00"; Flags: createvalueifdoesntexist

Access 2013 DBF Support.iss

With the template file in place, we can now create version-specific Inno Setup stubs that build on the template file.  Both of these stub files should be placed in the same directory as the .isi template file.

We'll start with the 32-bit installer first:

[ISPP]
#include <.\Access 2013 DBF Support.isi>

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{22C2D3F0-7F03-4DA1-AC75-0BC3467CF7F8}

Access 2013 DBF Support (64).iss

[ISPP]
#define Access64bit
#include <.\Access 2013 DBF Support.isi>

[Setup]
AppId={{0650DAAA-5B84-4556-BDDA-637173A5C93C}

Downloadable Resources

I combined all the files you need to re-create the installers on your own machine into a single downloadable .zip file:

Here are the setup files themselves if you don't want to bother building them from source using Inno Setup (these are the same files linked at the top of the article):


External references

Inno Setup Downloads
7-Zip

All original code samples by Mike Wolfe are licensed under CC BY 4.0