如何以编程方式确定Jet数据库引擎类型

时间:2010-05-24 14:41:53

标签: c# .net ms-access jet

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

升级(相对)容易。调用JRO.JetEngine对象的CompactDatabase方法(as described here)应该可以解决这个问题,但在此之前我需要确定是否需要升级。如何确定Jet OLEDB:现有数据库的引擎类型?这可以从开放的OleDBConnection确定吗?

注意:

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

4 个答案:

答案 0 :(得分: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,它已经在Jet4x中,否则它是早期版本。

以下是您正在查看的升级技术的另一个示例:Convert MDB database to another format (JET, access version)

答案 1 :(得分:1)

您可以使用Office Interop获取信息(从文章中偷偷盗取):

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

修改

另一种方法是使用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;
}

答案 2 :(得分:1)

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

答案 3 :(得分:-1)

我知道这是一篇旧帖子,但我已经找了好几天找到可以检索的其他属性列表,例如" Jet OLEDB:引擎类型"。这是一个包含列出的所有属性的MS链接。 Jet Provider Specific Connection Parameters Listing