【发布时间】:2011-04-21 06:15:49
【问题描述】:
我正在使用 Delphi 程序来压缩 Access 数据库
程序的代码片段是:
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;
此过程的结果是 Compact Access 数据库,但采用 Access 2002-2003 格式。
我无法找到问题区域。是否需要更新某些 dll 或注册表设置? 请帮忙...
【问题讨论】:
-
您确定您使用的是 5 型引擎吗? CompactDatabase 方法描述 (msdn.microsoft.com/en-us/library/bb237197(office.12).aspx) 中使用的连接字符串使用“Provider=Microsoft.Jet.OLEDB.4.0;”你的代码指的是“Microsoft.ACE.OLDDB.12.0” 喷气发动机的最高版本是4。版本12还有很长的路要走?span>
-
"Provider=Microsoft.Jet.OLEDB.4.0;"用于Access 97/2000访问数据库,对于Access2007,使用'Provider=Microsoft.ACE.OLEDB.12.0'。
-
严格来说,“Provider=Microsoft.Jet.OLEDB.4.0;”适用于所有 Jet 4 数据库,这意味着 A2000、A2002、A2003 以及以 A2000 或更高格式创建的任何 MDB 文件,包括在 A2007 或 A2010 中创建的 MDB 文件。对于 ACCDB,您需要使用 ACE,而不是 Jet 4。Jet 4 对 ACCDB 格式一无所知,直到 A2007 引入 ACE。
标签: delphi ms-access ms-access-2007 compact-database