5

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

如何才能做到这一点?

4

5 回答 5

11

在我扔掉这段代码之前,它还不如在 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 访问该数据库。

于 2008-10-01T01:31:50.780 回答
1

我和 Autsin 做了同样的事情,创建了一个 Access db,然后将它作为托管资源包含到我的项目中。在那里,它包含在编译代码中,您可以根据需要将其复制到硬盘上多次。空数据库也相对较小,因此没有太多开销。

额外的好处是能够设置数据库,如果您知道它将如何使用或每次将添加哪些表,您可以减少编码量和缓慢的数据库查询。

于 2008-10-01T03:36:34.067 回答
0

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

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

这应该适用于访问 2007 及以下版本

于 2008-10-01T01:41:14.673 回答
0

有趣的问题——我从来没有想过像这样动态地创建一个。我一直将我的基线数据库作为资源包含在项目中,并在我需要新数据库时制作了一份副本。

于 2008-10-01T02:08:28.867 回答
0

ACE不在任何框架中(尚未。即不在 1、2、3.5、4、4.5 中)

它也不是 Windows 更新的一部分。

JET4Framework2 及以上。

如果您正在使用 Access/MDB 文件等,则不要假设 ACE 存在。

于 2013-07-06T10:22:53.243 回答