创建Access 97数据库,而不依赖于Access

时间:2014-07-27 11:46:38

标签: c# ms-access jet

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

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

1 个答案:

答案 0 :(得分:2)

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

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

要创建空的.mdb数据库,您需要使用 Microsoft ADO Ext。 2.8用于DDL和安全性Interop.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 language并通过OleDB执行这些命令,如command.ExecuteNonQuery("CREATE TABLE Staff (FirstName CHAR, LastName CHAR)");

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

要打开数据库,您可以像往常一样使用OldDb。

需要注意的事项:确保明确地将App的目标设置为x86;使用AnyCPU可能会在64位计算机上遇到麻烦,因为您正在访问32位COM组件。

其他参考资料: