Как программно определить базу данных Jet Engine Engine Type - PullRequest
10 голосов
/ 24 мая 2010

У меня есть программа, которая должна обновить любую базу данных Access (Jet), которую она открывает, до JET Version4.x, если это еще не та версия. (Это позволяет использовать функции синтаксиса SQL-92)

Обновление (относительно) легко. Вызов метода CompactDatabase объекта JRO.JetEngine (, как описано здесь ) должен сделать свое дело, но прежде чем я сделаю это, мне нужно определить, требуется ли обновление. Как определить Jet OLEDB: тип двигателя для существующей базы данных? Можно ли это определить по открытому соединению OleDBC?

Примечание:

  1. Я говорю о версиях базы данных, а не о версиях библиотеки Jet.
  2. C # или .Net решение с благодарностью.
  3. Это приложение, которое использует движок Jet, а не приложение Access.

Ответы [ 4 ]

4 голосов
/ 29 мая 2010

Вам нужно будет установить ссылку на 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, в противном случае это более ранняя версия.

Вот еще один пример техники обновления, которую вы также рассматриваете: Преобразование базы данных MDB в другой формат (JET, версия доступа)

1 голос
/ 02 июня 2010

Просто выполните тестовый вызов оператора, который использует функции языка SQL-92Если это не удалось, вам нужно обновить.

1 голос
/ 02 июня 2010

Вы можете использовать Office Interop и получить информацию (явно украденную из статьи):

Как определить, какая версия доступа использовалась для создания базы данных?

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

EDIT:

Другой способ - использовать DAO (из этой ссылки 1013 * в переводе с японского). Возможно, вам придется настроить значения, но это выглядит как хорошее место для начала.

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 голосов
/ 01 августа 2017

Я знаю это старое сообщение, но я искал несколько дней, чтобы найти список других свойств, которые можно получить, например, "Jet OLEDB: Тип двигателя". Вот ссылка на MS со всеми перечисленными свойствами. Перечень параметров подключения, специфичных для Jet Provider

...