Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 压缩Access 2007数据库时出现问题,压缩后Access 2007数据库转换为Access 2002-2003格式_Delphi_Ms Access_Ms Access 2007_Compact Database - Fatal编程技术网

Delphi 压缩Access 2007数据库时出现问题,压缩后Access 2007数据库转换为Access 2002-2003格式

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 :

我正在使用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;
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;