在程序中,为了防止mdb数据库被误删,我将数据库编译到res资源文件中去了,作成了mymdb.res,并添加到单元,但不知如何调用?

解决方案 »

  1.   

    1.比如你的res文件内容如下:
    mydb dbfile 'my.mdb'2.读取
    var
     Res: TResourceStream;
    begin
     Res := TResourceStream.Create(Hinstance,'mydb', Pchar('dbfile'));
     Res.SavetoFile('c:\tmp.mdb');//释放到新的空间
    end;
      

  2.   

    把数据库编译到res资源文件中,这样的库在运行过程中可以修改,但下次启动时还是原始数据。
      

  3.   

    //释放数据库
    function ExtractRes(pFilePath,pFileName,pFileExteName: string): Boolean;
    var
      vFileName: string;
      Res: TResourceStream;
    begin
      vFileName := pFilePath + pFileName + '.' + pFileExteName;
      if FileExists(vFileName) then
      begin
        Result := True;
        Exit;
      end;
      ForceDirectories(pFilePath);
      try
        Res := TResourceStream.Create(Hinstance, pFileName+'DB', PChar(pFileExteName));
        try
          Res.SavetoFile(vFileName);
          Result := True;
        finally
          Res.Free;
        end;
      except
        Result := False;
      end;
    end;//在数据单元创建时调用
    procedure TDM.DataModuleCreate(Sender: TObject);
    var
      AppPath,CPass,CName,Conn1:string;
      ConfigStr,SystemDataBaseName:string;
      ini: TIniFile;
      m:Integer;
      vDBName: string;
    begin
      gApplTerm := False;
      GetDir(0,AppPath);
      vDBName := AppPath + '\DataBase\Language.mdb';
      if not  ExtractRes(AppPath + '\DataBase\','Language','mdb') then//释放数据库
      begin
        Application.MessageBox('数据库丢失,系统无法运行!','系统提示',MB_ok);
        gApplTerm := True;
        Exit;
      end;end;
      

  4.   


    资源编译好之后是只读的。你的程序也不能做到使用的时候释放出来,使用完又编译回去所以为了防止mdb数据库被误删,把mdb编译到资源中我个人觉得是没有意义的。为了部署方便还可以说得过去。
      

  5.   


    同意2位说的,发现MDB被删除后,就从资源里拷一个出来,
    但是这样被删除的数据库以前的纪录也都没了
      

  6.   

    var 
     Res: TResourceStream; 
    begin 
      if FileExists('c:\tmp.mdb') then exit;
     Res := TResourceStream.Create(Hinstance,'mydb', Pchar('dbfile')); 
     Res.SavetoFile('c:\tmp.mdb');//释放到新的空间 
    end;这样写,防止覆盖掉已经更新的记录。
      

  7.   

    来晚了。。 if FileExists(Filename) then exit; 
     try 
        Res := TResourceStream.Create(Hinstance,PChar(ResType), PChar(ResName)); 
        try 
          Res.SavetoFile(Filename); 
          Result := True; 
       finally 
          Res.Free; 
       end; 
      

  8.   

    谢谢各位的指点,因我的数据库主要是作查询用,故将数据库文件加入到资源文件中。用上述的方法出现错误,请问错在哪里?implementation
    uses resutils;
    {$R *.dfm}
    {$R mymdb.RES}procedure TForm1.Button1Click(Sender: TObject);
    var Res: TResourceStream;
    begin
    Res := TResourceStream.Create(Hinstance,pchar('RCDATA'), Pchar('mymdb.res'));
    Res.SavetoFile('c:\new.mdb');
    end;错误信息
    message"Resource RCDATA not found"说明:
    附资源文件mymdb.rc:
    mymdb RCDATA dqb.mdb编译的资源文件为mymdb.res。
      

  9.   

    字还打错,TResourceStream.Create第2个参数是标题符,第3个是类型,不用加指针类型,无语