Delphi 压缩Access 2007数据库时出现问题,压缩后Access 2007数据库转换为Access 2002-2003格式
我正在使用Delphi程序压缩Access数据库 程序代码为:Delphi 压缩Access 2007数据库时出现问题,压缩后Access 2007数据库转换为Access 2002-2003格式,delphi,ms-access,ms-access-2007,compact-database,Delphi,Ms Access,Ms Access 2007,Compact Database,我正在使用Delphi程序压缩Access数据库 程序代码为: procedure CompactDatabase(pFullDatabasePathName : string; pLoginName : string = ''; pPassword : string = ''; pSystemDb : string = ''); var JE : TJetEngine; sdbTemp : String; sdbTempConn :
procedure CompactDatabase(pFullDatabasePathName : string; pLoginName : string = ''; pPassword : string = ''; pSystemDb : string = '');
var
JE : TJetEngine;
sdbTemp : String;
sdbTempConn : String;
sdbSrcConn : String;
loginString : String;
systemDbString: String;
compactDone : Boolean;
const
SProviderAccess2007 = 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=';
SEngine = ';Jet OLEDB:Engine Type=';
Access2007EngineType = '5';
begin
loginString := '';
if (pLoginName <> '') then
loginString := ';User Id= ' + pLoginName + '; Password = ' + pPassword;
if ((pLoginName = '') and (pPassword <> '')) then
loginString := ';Jet OLEDB:Database Password = ' + pPassword;
systemDbString := '';
if (pSystemDb <> '') then
systemDbString := ';Jet OLEDB:System Database = ' + pSystemDb;
try
compactDone := False;
JE := TJetEngine.Create(Application);
sdbTemp := ExtractFileDir(pFullDatabasePathName) + '\TEMP' + ExtractFileName(pFullDatabasePathName);
if FileExists(sdbTemp) then
DeleteFile(sdbTemp);
//Access 2007
if not compactDone then
begin
try
sdbSrcConn := SProviderAccess2007 + pFullDatabasePathName + loginString + systemDbString + SEngine + Access2007EngineType;
sdbTempConn := SProviderAccess2007 + sdbTemp + SEngine + Access2007EngineType;
JE.CompactDatabase(sdbSrcConn, sdbTempConn);
compactDone := True;
except
end;
end;
if not compactDone then
Raise Exception.Create('Compacting of database: ' + pFullDatabasePathName + 'failed!');
if (not DeleteFile(pFullDatabasePathName)) then
Raise Exception.Create('Compacting failed because cannot delete database: ' + pFullDatabasePathName);
if (not RenameFile(sdbTemp, pFullDatabasePathName)) then
Raise Exception.Create('Compacting failed because cannot overwrite database: ' + pFullDatabasePathName + ' by temporary compacted database: ' + sdbTemp);
if FileExists(sdbTemp) then
DeleteFile(sdbTemp);
finally
JE.FreeOnRelease;
end;
end;
procedure-CompactDatabase(pFullDatabasePathName:string;pLoginName:string='';pPassword:string='';pSystemDb:string='';
变量
JE:TJetEngine;
sdbTemp:字符串;
sdbTempConn:字符串;
sdbSrcConn:字符串;
登录字符串:字符串;
systemDbString:String;
compactDone:布尔型;
常数
SProviderAccess2007='Provider=Microsoft.ACE.OLEDB.12.0;数据源=';
SEngine=';Jet OLEDB:发动机类型=';
Access2007EngineType='5';
开始
登录字符串:='';
如果(pLoginName“”),则
登录字符串:=';用户Id='+pLoginName+';密码='+pPassword;
如果((pLoginName=“”)和(pPassword“”),则
登录字符串:=';Jet OLEDB:数据库密码='+pPassword;
SystemDstring:='';
如果(pSystemDb“”),则
SystemDstring:=';Jet OLEDB:系统数据库='+pSystemDb;
尝试
compactDone:=假;
JE:=TJetEngine.Create(应用程序);
sdbTemp:=ExtractFileDir(pFullDatabasePathName)+'\TEMP'+ExtractFileName(pFullDatabasePathName);
如果文件存在(sdbTemp),则
删除文件(sdbTemp);
//访问2007
如果不这样做的话
开始
尝试
sdbSrcConn:=SProviderAccess2007+pFullDatabasePathName+loginString+SystemDstring+SEngine+Access2007EngineType;
sdbTempConn:=SProviderAccess2007+sdbTemp+SEngine+Access2007EngineType;
JE.压缩数据库(sdbSrcConn、SDBTEMPCCONN);
compactDone:=真;
除了
终止
终止
如果不这样做的话
引发异常。Create('压缩数据库:'+pFullDatabasePathName+'失败!');
如果(不是DeleteFile(pFullDatabasePathName)),则
引发异常。Create('压缩失败,因为无法删除数据库:'+pFullDatabasePathName);
如果(不是重命名文件(sdbTemp,pFullDatabasePathName)),则
引发异常。Create('压缩失败,因为无法通过临时压缩数据库'+sdbTemp'覆盖数据库:'+PFULLDABASEDABASEPATHNAME+);
如果文件存在(sdbTemp),则
删除文件(sdbTemp);
最后
自由释放;
终止
终止
此过程的结果是紧凑型Access数据库,但采用Access 2002-2003格式
我无法找到问题区域。是否需要更新某些dll或注册表设置?
请帮忙 感谢您的支持,我找到了解决这个问题的有效方法,值得与您分享 现在我使用的不是Jet4,而是'DAO.DBEngine.120'。 结果是Access 2007格式的压缩数据。
干杯 您确定使用的是5型发动机吗?CompactDatabase方法说明()中使用的连接字符串使用的是“Provider=Microsoft.Jet.OLEDB.4.0”;您的代码引用的是“Microsoft.ACE.OLDDB.12.0”。Jet引擎的最高版本是4。版本12还有很长的路要走。“Provider=Microsoft.Jet.OLEDB.4.0;”用于Access 97/2000 Access数据库,对于Access2007,“Provider=Microsoft.ACE.OLEDB.12.0”用于Access数据库。严格来说,“Provider=Microsoft.Jet.OLEDB.4.0;”用于所有Jet 4数据库,这意味着A2000、A2002、A2003以及以A2000或更高格式创建的任何MDB文件,包括它是在2007年还是2010年创建的。对于ACCDB,您需要使用ACE,而不是Jet 4。JET4对ACCDB格式一无所知,直到2007年引入ACE后才出现ACCDB格式。
//Access 2007
if not compactDone then
begin
try
// DaoAccess2007 is OleVariant Type
DaoAccess2007 := CreateOleObject('DAO.DBEngine.120');
DaoAccess2007.CompactDatabase(pFullDatabasePathName,sdbTemp);
compactDone := True;
except
end;
end;