2014-07-27 159 views
1

爲了與舊版軟件兼容,我需要創建與Access 97或更早版本兼容的.mdb數據庫。我不能使用OLEDB,因爲我不能依靠Access來安裝。我也不想安裝Office連接組件。在不依賴Access的情況下創建Access 97數據庫

是否有任何第三方庫可以做到這一點?

+0

你有對MS Access引擎是什麼(http://www.microsoft.com/en-ie/download/details .aspx?id = 13255),它是免費的。從那裏你可以創建任何你想要的版本(http://msdn.microsoft.com/en-us/library/office/ff835033(v=office.15).aspx) – Fionnuala

+0

謝謝,但只有創建它纔有可能訪問v3.0及更高版本類型的數據庫。當我在.CreateDatabase調用中指定DatabaseTypeEnum.dbVersion30時,它可以工作。但是,對於任何較低版本(dbVersion20),調用會失敗,並顯示「找不到可安裝的ISAM」。我想創建版本2.0或1.1數據庫。 – LTR

+1

Deary me,我記得它曾經工作過,我相當肯定你可以用Jet引擎做這件事,從2010年回到版本1或2可能會有點過頭。您可能擁有Jet引擎,具體取決於您的操作系統。如果你在64位上,它會變得更加複雜。 – Fionnuala

回答

2

您不需要安裝Access來創建.mdb文件,因爲Jet引擎永遠是Windows的一部分(因爲Windows 2000是MDAC組件的一部分)。

只有在計劃創建較新的.accdb文件(與Access 2007及更高版本兼容)時,才需要安裝ACE驅動程序。

若要創建一個空的.mdb數據庫,您需要使用Microsoft ADO分機。 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。

要小心的事情:確保你的應用程序的目標明確地設置爲x86;使用AnyCPU可能會讓您在64位機器上遇到麻煩,因爲您正在訪問32位COM組件。

其他參考資料:

相關問題