Problème de compactage Access 2007 Base de données, Access 2007 Après Compactage base de données est converti au format Access 2002-2003
-
27-09-2019 - |
Question
J'utilise une procédure Delphi à la base de données Compact accès
Code de sniphet de la procédure est:
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;
Le résultat de cette procédure est la base de données Compact Access, mais au format Access 2002-2003.
Je suis incapable d'obtenir la zone de problème. Est certains paramètres de dll ou Regsitry doit être renouvelé? S'il vous plaît aider ...
La solution
Merci 4 ur soutien, je l'ai trouvé une solution de travail à ce problème et a trouvé utile de partager avec vous.
Maintenant, au lieu d'utiliser Jet 4, je suis maintenant en utilisant 'DAO.DBEngine.120'.
//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;
Le résultat est le compactés Databsae au format Access 2007. Vive!
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow