tags:

views:

805

answers:

4

I need to create an access (mdb) database without using the ADOX interop assembly.

How can this be done?

+3  A: 

Before I throw away this code, it might as well live on stackoverflow

Something along these lines seems to do the trick:

if (!File.Exists(DB_FILENAME))
{
    var cnnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + DB_FILENAME;

    // Use a late bound COM object to create a new catalog. This is so we avoid an interop assembly. 
    var catType = Type.GetTypeFromProgID("ADOX.Catalog");
    object o = Activator.CreateInstance(catType);
    catType.InvokeMember("Create", BindingFlags.InvokeMethod, null, o, new object[] {cnnStr});

    OleDbConnection cnn = new OleDbConnection(cnnStr);
    cnn.Open();
    var cmd = cnn.CreateCommand();
    cmd.CommandText = "CREATE TABLE VideoPosition (filename TEXT , pos LONG)";
    cmd.ExecuteNonQuery();

}

This code illustrates that you can access the database using OleDbConnection once its created with the ADOX.Catalog COM component.

Sam Saffron
A: 

You don't need Jet(major headache) installed, if you use this connection string in .net 3.5

Provider=Microsoft.ACE.OLEDB.12.0;Data
Source=C:\myFolder\myAccess2007file.accdb;Persist
Security Info=False;

This should work on access 2007 and below

Aaron Fischer
Offtopic, do you know if this works on X64? Is this new to 3.5?
Sam Saffron
This is new to the 3.5 framework. I am not sure if its x64 compatible or not.
Aaron Fischer
Jet 4 is installed on all versions of Windows since Windows 2000, so why would you be worrying about bypassing Jet? The ACE is not necessarily going to be installed, so I don't see why you're recommending ACE. Is it distributed with the .NET 3.5 runtime?
David-W-Fenton
onedaywhen
I don't believe Jet is installed by default on Windows XP and higher. It has not been a part of MDAC since windows 2000. It only gets installed with older versions of MS Access. ACE is supposed to be part of .NET 3.5
Aaron Fischer
Jet is part of the Windows OS, starting with Windows 2000. That's why it's no longer in the MDAC, because all versions of Windows from 2000 on already include it.
David-W-Fenton
Aaron, how can you create a new Access database with this method? Using this connection string just allows you to connect to an existing one (no?)
Jess Chadwick
If memory serves you just issue a create table command and the provider will create the file for you.
Aaron Fischer
A: 

Interesting question -- I've never thought to create one on the fly like this. I've always included my baseline database as a resource in the project and made a copy when I needed a new one.

Austin Salonen
+1  A: 

I've done the same as Autsin, create an Access db then included it into my project as a managed resource. Once there, it is included in the compiled code and you can copy it to hard disk as many times as you want. Empty databases are relatively small too, so there isn't much overhead.

The added bonus is the ability to set up the database if you know how it will be used or what tables will be added every time, you can reduce the amount of coding and slow database queries.

Fry