10

我有一个程序需要将它打开的任何 Access (Jet) 数据库升级到 JET Version4.x,如果它还不是那个版本的话。(这可以使用 SQL-92 语法特性)

升级(相对)容易。调用 JRO.JetEngine 对象的 CompactDatabase 方法(如此处所述)应该可以解决问题,但在此之前,我需要确定是否需要升级。如何确定现有数据库的 Jet OLEDB:Engine Type?这可以从打开的 OleDBConnection 中确定吗?

笔记:

  1. 我说的是数据库版本,而不是 Jet 库版本。
  2. 非常感谢 C# 或 .Net 解决方案。
  3. 这是使用 Jet 引擎的应用程序,而不是 Access 应用程序。
4

4 回答 4

4

您必须设置对 ADO 的引用,然后才能获取该属性。

从 Access 内部

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

从 Access 外部

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,则它已经在 J​​et4x 中,否则它是早期版本。

这是您正在查看的升级技术的另一个示例:将 MDB 数据库转换为另一种格式(JET,访问版本)

于 2010-05-29T03:21:36.810 回答
1

您可以使用 Office Interop 并获取信息(公然从文章中窃取):

如何确定用于创建数据库的 Access 版本?

    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;
    }
}

编辑:

另一种方法是使用 DAO(来自从日语翻译的这个链接)。您可能需要调整这些值,但它看起来是一个不错的起点。

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;
}
于 2010-06-01T20:25:48.280 回答
1

只需对使用 SQL-92 语言特性的语句进行测试调用。如果失败,则需要升级。

于 2010-06-02T15:18:52.550 回答
-1

我知道这是一篇旧帖子,但我已经找了好几天才能找到可以检索的其他属性列表,例如“Jet OLEDB:Engine Type”。这是列出所有属性的 MS 链接。 Jet Provider 特定连接参数列表

于 2017-08-01T14:31:00.517 回答