Как определить базу данных Jet с программным обеспечением
У меня есть программа, которая должна обновить любую базу данных Access (Jet), которую он открывает JET Version4.x, если она еще не является той версией. (Это позволяет использовать синтаксические возможности SQL-92)
Модернизация (относительно) проста. Вызов метода CompactDatabase объекта JRO.JetEngine(как описано здесь) должен сделать трюк, но прежде чем я это сделаю, мне нужно определить, требуется обновление. Как определить Jet OLEDB: Тип двигателя существующей базы данных? Можно ли это определить из открытого OleDBConnection?
Примечание:
- Я говорю о версиях баз данных, а не о версиях библиотеки Jet.
- Решение С# или .Net было высоко оценено.
- Это приложение, которое использует движок Jet, а не приложение Access.
Ответы
Ответ 1
Вам нужно будет установить ссылку на 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, версия для доступа)
Ответ 2
Вы можете использовать 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 (из этой ссылка, переведенной с японского). Возможно, вам придется настроить значения, но это похоже на хорошее место для начала.
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;
}
Ответ 3
Просто выполните тестовый вызов инструкции, которая использует функции языка SQL-92. Если это не удается, вам необходимо обновить.
Ответ 4
Я знаю это старое сообщение, но я искал несколько дней, чтобы найти список других свойств, которые можно получить, например, "Jet OLEDB: Тип двигателя". Здесь ссылка MS со всеми перечисленными свойствами.
Спецификация параметров подключения поставщика Jet