创建不依赖于Access的Access 97数据库

本文关键字:Access 数据库 创建 依赖于 | 更新日期: 2023-09-27 18:14:58

为了与遗留软件兼容,我需要创建一个与Access 97或更早版本兼容的.mdb数据库。我不能使用OLEDB,因为我不能依靠Access来安装。我也不想安装Office连接组件。

是否有第三方库可以做到这一点?

创建不依赖于Access的Access 97数据库

您不需要安装Access来创建.mdb文件,因为Jet引擎一直是Windows的一部分(自Windows 2000作为MDAC组件的一部分)。

只有在计划创建较新的.accdb文件(与Access 2007及以上版本兼容)时才需要安装ACE驱动程序。

创建一个空的.mdb数据库,需要使用Microsoft ADO Ext. 2.8 for DDL and SecurityInterop.ADOX.dll

你不需要在你的VS项目中直接引用它,你可以使用后期绑定从机器上可用的任何版本创建对象:

void Main()
{
    var conStr = GetConnectionString(@"C:'Users'user'Desktop'myDatabase.mdb", null, null);
    CreateDb(conStr);
}
//[System.Security.SecuritySafeCritical]
public void CreateDb(string connectionString) {
    Type adoxType = Type.GetTypeFromProgID("ADOX.Catalog");
    object o = Activator.CreateInstance(adoxType);
    o.GetType().InvokeMember("Create", BindingFlags.InvokeMethod, null, o, new object[] { connectionString });
    object connection = o.GetType().InvokeMember("ActiveConnection", BindingFlags.GetProperty, null, o, null);
    if(connection != null)
        connection.GetType().InvokeMember("Close", BindingFlags.InvokeMethod, null, connection, null);
}
public static string GetConnectionString(string database, string userid, string password) {
    return String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Mode=Share Deny None;data source={0};user id={1};{3}password={2};", 
    database, userid, password, string.IsNullOrEmpty(password) ? string.Empty : "Jet OLEDB:Database ");
}

你可以使用LINQpad来测试代码,它在我的机器上工作。注意,如果您尝试在没有创建文件权限的文件夹中创建数据库,您将得到一个不相关的COM异常,如:

Microsoft Jet数据库引擎无法打开文件"C:'myDatabase.mdb"。它已被其他用户独占打开,或者您需要权限才能查看其数据。

要创建表和索引等,您可以使用Access的DDL语言并通过OleDB执行这些命令,如command.ExecuteNonQuery("CREATE TABLE Staff (FirstName CHAR, LastName CHAR)");

另一个可能更简单的解决方案可以避免所有这些代码,就是简单地将一个空数据库与应用程序一起发布,并在需要新数据库时复制该数据库。

打开数据库,你可以像往常一样使用oldb。

注意事项:确保将应用程序的目标明确设置为x86;使用AnyCPU可能会让你在64位机器上遇到麻烦,因为你正在访问32位COM组件。

其他引用:

  • 用c#编程创建和连接Microsoft Access数据库
  • 访问DDL(数据定义语言)参考