如何在没有互操作程序集的情况下创建Microsoft Jet(访问)数据库?

时间:2020-03-06 14:57:24  来源:igfitidea点击:

我需要在不使用ADOX互操作程序集的情况下创建访问(mdb)数据库。

如何才能做到这一点?

解决方案

在我扔掉这段代码之前,它可能还存在于stackoverflow上

这些思路似乎可以解决问题:

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();

}

此代码说明,一旦使用ADOX.Catalog COM组件创建了OleDbConnection,就可以使用该数据库访问数据库。

如果在.net 3.5中使用此连接字符串,则不需要安装Jet(严重头痛)

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

这应该适用于Access 2007及更低版本

有趣的问题-我从未想过像这样即时创建一个。我一直将基准数据库作为项目中的资源包括在内,并在需要新数据库时进行复制。

我完成了与Autsin相同的操作,创建了一个Access db,然后将其作为托管资源包含在我的项目中。到达该位置后,它将包含在已编译的代码中,我们可以根据需要将其复制到硬盘上多次。空数据库也相对较小,因此没有太多开销。

额外的好处是,如果我们知道如何使用数据库或者每次都会添加什么表,就可以建立数据库,这样可以减少编码量并减慢数据库查询的速度。