The converter needs JavaScript: it checks your browser with Cloudflare Turnstile before it takes a file. Turn JavaScript on to convert a database here. It runs AccessConverter 3.3.0.
About
This is an online Microsoft Access database conversion tool to convert old and new Access database formats to some other popular databases and formats. It runs AccessConverter, my command line tool built on Jackcess, a Java library for reading and writing MS Access databases. It takes .mdb and .accdb files from every Access version Jackcess reads, Access 97 through Microsoft 365, including Access 97 files in any Windows code page (Greek, Cyrillic, Japanese, …).
MS Access was the first database I got my hands on when I began writing code. I have some old projects using Access databases that I want to rebuild, or just get the old data to port to some other environments. I even have some clients with systems using old Access databases that sometimes is needed to be converted to process and use all the data. So, I built up this online tool to have it anytime and for everyone to use it.
Exports
It exports an SQLite database, a MySQL dump (MySQL 8.0.13 or later), a MariaDB dump (MariaDB 10.11 or later), and JSON. The schema comes along as far as the target can enforce it: primary keys, unique and plain indexes, foreign keys with their cascade rules, NOT NULL, defaults, validation rules as CHECK constraints, and descriptions as comments. A constraint is written only when the existing data already satisfies it, so everything Access accepted still imports. Every value is exported exactly, and anything that can’t be is named in the report. The JSON is one document: the schema first, then every table’s rows as objects, or as arrays if you prefer. SQLite and JSON outputs are read back and every value is compared with your database.
Pictures, files and OLE objects are left out unless you ask for them. You get a zip with the output and a report of the tables, rows and any warnings, with what to do about each.
What isn’t converted
Queries, forms, reports, macros and VBA modules are not read, and have no equivalent in the targets. Linked tables are listed in the report without their data, since it lives in another database: upload the back-end file to convert it too. Access user-level security (permissions and workgroup files) is not carried over.
Password-protected databases
If the database is encrypted (Access 2007 and later), the page asks for its password after the upload, with three attempts. The password is kept only until the converter has read it, and never logged. The “database password” of Access 97–2003 doesn’t encrypt the file, so those convert without it.
Limits
Up to 50 MB per upload, 1,000 tables and 10 million rows per database and 5 minutes per conversion. You can convert 5 databases an hour, one at a time.
About the data
Every upload must have a supported Access header and open in the converter, or it is rejected and deleted. Each conversion runs in its own isolated container, with no network and nothing but its own files, and nothing inside your database is ever run.
Nobody looks at your database. The uploaded file is deleted as soon as the conversion ends. The result can be downloaded only from the browser that uploaded it, and it is deleted when you press “Delete my files”, or an hour after the conversion at the latest.
Bugs
Please report any bugs or features you may want, by using the Contact Form on this blog.
Open source
I have released the source code and binaries of the Java application on Github. Version 3 is a rewrite under the Apache License 2.0; earlier versions were MIT.
Github repo: https://github.com/clytras/AccessConverter
Is it open source?
Hey Ivanka!! It's a small tool that I could just go and make it OS, but I guess I am a bit lazy about it! I can give it to you and use it as you want if you're interesting, it's not a big deal. Just let me know and you'll have it.
Yeah, I'd love to see the code beneath it. :)
Open Source done! :) Check the Github repo links at the bottom of this article. You'll find source code along with binaries at the `v1.0` release tag.
I really appreciate it!
I also really appreciate it, very useful for making graphs and charts with D3 or amcharts. Thanks very much!,
Thank you @disqus_gbH7qPsHi7:disqus. It is very useful to me as well, and that’s why I wanted to share it with everyone.
Very nice tool, but seeing some situations where an mdb table gets created as a sqlite table, but not populated. Other tables in same db are both created and populated. Here is a partial extract from the created log file: Wondering where I might look to see what could be happening. I get the same behavior whether using the web tool or java jar directly. Windows 10.
Thanks.
{
"text":"Could not insert to table 'tblArmorType'",
"source":"AccessConverter:SQLiteConverter:insertData",
"exception":"org.sqlite.SQLiteException: [SQLITE_ERROR] SQL error or missing database (near \",\": syntax error)"
},
{
"text":"Could not create table 'tblDamageElementInventory'",
"source":"AccessConverter:SQLiteConverter:createTable",
"exception":"org.sqlite.SQLiteException: [SQLITE_ERROR] SQL error or missing database (near \"Group\": syntax error)"
},
{
"text":"Could not insert to table 'tblDamageElementInventory'",
"source":"AccessConverter:SQLiteConverter:insertData",
"exception":"org.sqlite.SQLiteException: [SQLITE_ERROR] SQL error or missing database (near \"Group\": syntax error)"
},
Hello @richardmales:disqus,
It seems like there is a syntax error to the SQL code generated by the SQLiteConverter class.
I have added SQL code logging on errors, so we'll see the code on these errors.
I have updated Github code and added a v1.1 release with this addition that you can download and try to see the SQL code that result to those errors; then you can share it with me to see what's the culprit. (Haven't updated the live tool on the blog, so, don't try it online yet)
You should add a issue to Github so we can work it on there; it will better for all.
Thank you. I am not a Java programmer at all. I originally used the jar from sourceforge to do my testing. I have grabbed the Github code for 1.1, downloaded NetBeans and resolved all of the dependency jars. Still getting errors on build, probably related to my attempt to brute force all of this but will attempt to work through them. fyi, this is what I am getting (partial):
C:\Users\males_000\Downloads\AccessConverter-master\AccessConverter-master\src\accessconverter\MySQLConverter.java:23: error: package org.apache.commons.lang3.text does not exist
import org.apache.commons.lang3.text.StrBuilder;
C:\Users\males_000\Downloads\AccessConverter-master\AccessConverter-master\src\accessconverter\MySQLConverter.java:10: error: a type with the same simple name is already defined by the single-type-import of Column
import com.healthmarketscience.jackcess.IndexBuilder.Column;
C:\Users\males_000\Downloads\AccessConverter-master\AccessConverter-master\src\accessconverter\MySQLConverter.java:13: error: a type with the same simple name is already defined by the single-type-import of Row
import com.healthmarketscience.jackcess.impl.query.QueryImpl.Row;
C:\Users\males_000\Downloads\AccessConverter-master\AccessConverter-master\src\accessconverter\SQLiteConverter.java:21: error: package org.apache.commons.lang3.text does not exist
import org.apache.commons.lang3.text.StrBuilder;
C:\Users\males_000\Downloads\AccessConverter-master\AccessConverter-master\src\accessconverter\AccessConverter.java:147: error: cannot find symbol
FileUtils.write(outputFile, mysqlConverter.sqlDump.build(), "UTF-8");
symbol: method build()
location: variable sqlDump of type StrBuilder
As soon as I have a good build, I will test my database and add the issue on github as you suggest.
You didn't have to do all of these. I did compile it to jar file, I wouldn't expect people to build the jar each time we need to try some things. There is the JAR file of the 1.1 inside AccessConverter_v1.1.zip at v1.1 release tag. Grab this extract it and you'll find the jar inside.
Edit: Just to clarify, when I say I added the code to the log, I mean that now there will be an extra record to the log file generated, when there will be any errors, which will have the SQL code that did fail, so then we'll be able to track it and fix it. After you extract the jar, try tha same file and then check the log file and paste here the SQL code of the error.
Thank you. I had not seen the v1.1 release on github. I have pulled it and run, it most definitely gives me the info I need to track things down. I will be checking things out and then post. I want to make sure that the issues are not data errors within the Access db I am trying to convert.
I tried to operate from the source files because I did not want to ask you for the jar file. After many years of being on software forums, it is clear that it is best to put in some effort on your own before posting for additional help, and I respect that aspect of the culture. In any case, many thanks.
I see your latest reply in my email inbox, but I cannot see it here! So, I'll reply to this one. Very good catches there and thank you for the work on debugging.
For (a), yes that is a bad design. It's not a big deal to continue and insert the rest of the rows if one fails. I just need to restrict the error catch to the SQLite transaction commit only, not the entire insert loop.
For (b), I should have thought of that when I was building this! Yes, SQLite has many keywords which of course can't be used as names. A prefix (default and user defined) I think will solve this.
For (c) it's easy to handle this by just replacing all spaces in names with an underscore character; again this character can be user defined.
I will work on these issues and I will come up with a new release by the end of the next week I beleive. I'll keep you informed.
Yes, I posted my findings here, but also didn't see it next time I viewed the page. All your suggestions are excellent. I will await your next release, and test on my database when it is available. I also have a number of other databases from the same project that I can use for testing.
FYI, I previously pointed the 1.0 converter to an Access mdb that had links to a number of other tables in other mdb's. It processed all of the tables from the linked dbs into the single sqlite, so that is very nice. As one of the linked tables was about 2 GB, it took a while, but did process. It might be helpful to have some sort of progress text written to the console perhaps indicating what tables is currently being processed.
Hello again Richard,
I have some fixes ready for testing.
I have compiled a `v1.1.1_r1` which you can download from here https://lytrax.io/pub/Acces... (not uploaded on github yet; I will do it when it's more stable).
For (a) I got rid of the whole transaction and having SQLite to auto commit on each INSERT statement. That may be slower now for big tables; If you think it's slower now, then maybe I need to add this as an option to let the user deside if the program should process all the records as a whole transaction or individually.
For (b) and (c) I just used the grave accent character "`" to encolse both table and field names, which covers all the cases of SQLite keywords and names with spaces inside, all evaluating as valid and accepted SQL code now.
I created a basic progress status which is option triggered. The command parameter to show the progress is "-show-progress". Please check if it's significantly slower now that executes each INSERT query individually and reply back here.
Works very nicely, looks to have solved all problems I noted. I believe it is somewhat slower, not sure how much. Progress info very helpful. Suggest new line for each new table, so that the complete progress is shown. Not sure I need progress indicator for each insert, that probably slows down performance. Can also add start date/time, add date/time to the progress output for each table, plus elapsed time at end, for purposes of performance metrics.
Another thought - suggest a command-line parameter limiting the number of error messages on insert written to the log file for each attempted table. Could be very large if mdb data is seriously in violation.
Also, warn if user is attempting to use the same output db. I inadvertently did that when running twice, got lots of primary key violation errors.
Will be out of office for a few weeks, but will attempt to monitor the forum.
Again, thanks for a great and very useful tool.
Hi
I get persistently an error when I try to convert even a simple accdb file. Can you find out why?
Error Message:
"There was an unexpected error during the process". How can I support with the testfile?
Thank you for providing this service!
Regards,
Guido