我有一个程序需要升级它打开的任何Access(Jet)数据库,如果它不是那个版本,那么它打开到JET Version4.x. (这样可以使用SQL-92语法功能)
升级(相对)容易。调用JRO.JetEngine对象的CompactDatabase方法(as described here)应该可以解决这个问题,但在此之前我需要确定是否需要升级。如何确定Jet OLEDB:现有数据库的引擎类型?这可以从开放的OleDBConnection确定吗?
注意:
答案 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