2010-05-24 54 views
11

我有一個程序,需要升級它打開的所有Access(Jet)數據庫到JET Version4.x,如果它尚不是該版本。 (這使得能夠使用SQL-92語法特徵)如何以編程方式確定Jet數據庫引擎類型

升級是(相對)容易的。對JRO.JetEngine對象的CompactDatabase方法(as described here)的調用應該可以做到,但在執行此操作之前,需要確定是否需要升級。如何確定Jet OLEDB:現有數據庫的引擎類型?這可以從一個公開的OleDBConnection確定嗎?

注:

  1. 我談論的數據庫版本,而不是噴氣機庫版本。
  2. C#或.Net解決方案非常感謝。
  3. 這是一個使用Jet引擎而不是Access應用程序的應用程序。
+0

您不能從Connection對象讀取它嗎? – 2010-05-24 20:29:53

+0

你真的更新Access 97或以前的數據庫嗎?任何來自Access 2000的將使用Jet 4.0。 – Thomas 2010-05-29 16:24:17

+0

Jet 4支持A97的向後兼容性。也就是說,您可以使用Jet 4來更新Jet 3.x數據庫 - 無需爲此使用Jet 3.x。 – 2010-05-30 19:22:59

回答

4

您必須設置對ADO的引用,然後才能獲取該屬性。

從內部訪問

Dim cnn As ADODB.Connection 
Set cnn = CurrentProject.Connection 

從接入之外的

Dim cnn As New ADODB.Connection 
cnn.Open Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Contact.mdb 

最後

Debug.Print cnn.Properties("Jet OLEDB:Engine Type").Value 

釷是.Value將返回1到5.如果它是5,它已經在Jet4x中,否則它是早期版本。

這裏就是你要找的,以及升級技術的另一個例子:Convert MDB database to another format (JET, access version)

+0

爲什麼有人會在Access中使用ADO? DAO是迄今爲止來自Access本身的Jet數據的首選數據訪問接口。 – 2010-05-30 19:23:39

+0

有沒有辦法從OLEDBConnection獲取信息? – MZB 2010-06-01 18:09:23

+0

出於某種原因,ADO似乎期望在打開「缺少由另一用戶打開的工作組信息文件」連接時出現工作組文件和barfs--這是在我用OLEDB打開連接之前。 – MZB 2010-06-01 20:38:46

1

您可以使用Office互操作,並獲得信息(文章blatently被盜):

How Can I Determine Which Version of Access was Used to Create a Database?

public void WhichVersion(string mdbPath) 
    { 
     Microsoft.Office.Interop.Access.Application oAccess = new Microsoft.Office.Interop.Access.ApplicationClass(); 
     oAccess.OpenCurrentDatabase(mdbPath, false, ""); 

     Microsoft.Office.Interop.Access.AcFileFormat fileFormat = oAccess.CurrentProject.FileFormat; 

     switch (fileFormat) 
     { 
      case Microsoft.Office.Interop.Access.AcFileFormat.acFileFormatAccess2: 
       Console.WriteLine("Microsoft Access 2"); break; 
      case Microsoft.Office.Interop.Access.AcFileFormat.acFileFormatAccess95: 
       Console.WriteLine("Microsoft Access 95"); break; 
      case Microsoft.Office.Interop.Access.AcFileFormat.acFileFormatAccess97: 
       Console.WriteLine("Microsoft Access 97"); break; 
      case Microsoft.Office.Interop.Access.AcFileFormat.acFileFormatAccess2000: 
       Console.WriteLine("Microsoft Access 2000"); break; 
      case Microsoft.Office.Interop.Access.AcFileFormat.acFileFormatAccess2002: 
       Console.WriteLine("Microsoft Access 2003"); break; 
     } 

     oAccess.Quit(Microsoft.Office.Interop.Access.AcQuitOption.acQuitSaveNone); 
     Marshal.ReleaseComObject(oAccess); 
     oAccess = null; 
    } 
} 

編輯:

另一種方法是叔o使用DAO(從這個link翻譯日語)。您可能需要調整這些值,但它看起來是一個開始的好地方。

public int GetCreatedVersion(string mdbPath) 
{ 
    dao.DBEngine engine = new dao.DBEngine(); 
    dao.Database db = engine.OpenDatabase(mdbPath, false, false, ""); 
    string versionString = db.Properties["AccessVersion"].Value.ToString(); 
    int version = 0; 
    int projVer = 0; 

    switch (versionString.Substring(0, 2)) 
    { 
     case "02": 
      version = 2; break; 
     case "06": 
      version = 7; break; 
     case "07": 
      version = 8; break; 
     case "08": 
      foreach (dao.Property prop in db.Properties) 
      { 
       if (prop.Name == "ProjVer") 
       { 
        projVer = int.Parse(prop.Value.ToString()); 
        break; 
       } 
      } 
      switch (projVer) 
      { 
       case 0: 
        version = 9; break; 
       case 24: 
        version = 10; break; 
       case 35: 
        version = 11; break; 
       default: 
        version = -1; break;        
      } 
      break; 
     case "09": 
      foreach (dao.Property prop in db.Properties) 
      { 
       if (prop.Name == "ProjVer") 
       { 
        projVer = int.Parse(prop.Value.ToString()); 
        break; 
       } 
      } 
      switch (projVer) 
      { 
       case 0: 
        version = 10; break; 
       case 24: 
        version = 10; break; 
       case 35: 
        version = 11; break; 
       default: 
        version = -1; break; 
      } 
      break; 
    } 
    db.Close(); 

    return version; 
} 
+0

幾乎 - 但不完全。 +1爲近乎未命中。兩個問題:(a)不能假定用戶安裝了Access,只有JET,並且(b)上述解決方案打開Access UI並提示用戶是否打開「不安全」文件數據庫可能包含宏。由於用戶甚至沒有意識到正在使用JET(並且Access不在系統需求列表中),所以我不能這樣做。 (我試着告訴Access它是隱形的,但想必隱形的外衣會被解除,如果它想提示用戶...) – MZB 2010-06-01 21:05:38

+0

看看這個鏈接,以避免彈出框:http://support.microsoft.com/kb/317114(但它不會幫助你,因爲你不能假設用戶已經安裝了Access - 你應該更新你的問題來注意這一點)。 – GalacticJello 2010-06-01 21:29:10

+0

感謝您的幫助 - 第二種解決方案看起來很接近,但無論數據庫格式如何,總是返回「35」。 (我試圖給你另一個+1,但系統降低了分數而不是增加它!) – MZB 2010-06-02 11:47:14

1

只要對使用SQL-92語言功能的語句進行測試調用即可。如果失敗,則需要升級。

+0

如果我在回答自動被接受之前來過這裏,你就會有蝨子!測試一個特性的出現,而不是特定版本的出現總是更好。謝謝。 – MZB 2010-06-02 21:31:45

+0

但是答案是錯誤的,因爲SQL 92是否失敗的問題是使用哪個版本的Jet訪問數據文件以及您正在使用哪個接口(ADO使用SQL 92,DAO使用SQL 89)。這完全獨立於數據文件的版本。 – 2010-06-03 01:29:18

+0

@ David-W-Fenton。我將不得不進一步調查。 Jet驅動程序肯定比數據庫更新,但在較舊的數據庫上使用更新的語法失敗的DDL調用。順便說一下,通過OLEDB訪問,這大概等於ADO。 – MZB 2010-06-05 14:03:52

相關問題