首先我们来分步骤进行,
第一步:完全备份数据库服务器上指定的数据库
procedure BackUpDataBase;
var
  Path:string;
begin
  try
    path:=ExtractFilepath(application.exename);
    with DM.cmd do
    begin
       CommandText:='BACKUP DATABASE official TO disk=''D:\official_001.bak''';
       Execute;
    end; 
    MessageDlg('数据库备份成功!',mtInformation,[MBOK],0);
  except
     MessageDlg('数据库备份失败!',mterror,[MBOK],0);
  end;
end;第 2步 就是如何将数据库备份文件复制到自己的机器上,分2小步完成:
(1) 是否获得了服务器的读写权限
winexec('net use \\webserver 密码 /user:administrator',SW_HIDE); 然后再连接数据库服务器,copyD盘下的备份文件!
或者建立映射驱动,将服务器的D盘映射到自己机器上来作为一个Y盘
首先创建驱动器:
procedure CreateDriver(DriverID: string);
var
  NetSource:TNetResource;
  B:dword;
begin
try
    with NetSource do
    begin
       dwType:=RESOURCETYPE_ANY;
       lpLocalName:=Pansichar(DriverID);
       lpRemoteName:=Pchar('\\webserver\d$');
       lpProvider:='';
    end;  b:=WnetAddConnection2(netSource,Pchar(''),Pchar('administrator'),CONNECT_UPDATE_PROFILE);
  if not (b=NO_ERROR) then showmessage(SysErrorMessage(GetLastError));
 except
  // Exit;
   ShowMessage('无法联接网络路径');
 end;
end;
这是删除映射驱动器
procedure DeleteDriver(DriverID: string);
var 
  dwFlags: DWORD; 
  errCode: DWORD;
begin
  dwFlags := CONNECT_UPDATE_PROFILE;
  errCode := WNetCancelConnection2(PChar(DriverID), dwFlags, true);
  if (errCode <> NO_ERROR)  then
  Application.MessageBox(PChar(SysErrorMessage(GetLastError)), '', MB_OK);
end;当连接号数据库服务器,获得权限后,进行复制数据库备份文件
文件复制,带进度条
procedure NetFileCopy(SourceFile,MoveToFile:string;P:TProgressBar);
var
  FromF, ToF: file;
  NumRead, NumWritten: Integer;
  Buf: array[1..2048] of Char;
begin
    AssignFile(FromF, MoveToFile);
    Reset(FromF, 1); { Record size = 1 }    AssignFile(ToF,SourceFile); { Open output file }
    Rewrite(ToF, 1); { Record size = 1 }    P.postion:=0;
    P.max:=sizeof(FromF);
    repeat
        BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
        BlockWrite(ToF, Buf, NumRead, NumWritten);
        P.StepIt; 
    until (NumRead = 0) or (NumWritten <> NumRead);
    CloseFile(FromF);
    CloseFile(ToF);
    P.postion:=0;
end;
调用方式,
   NetFileCopy(path+'\back\W'+FormatDateTime('yy-mm-dd',date),'\\webserver/D$\official_001.bak',PB);
   或者(如果你创建的是Y)
NetFileCopy(path+'\back\W'+FormatDateTime('yy-mm-dd',date),'Y\official_001.bak',PB);第3步 我们在自己的机器上创建相同名字的数据库 这个很简单
procedure CreateDataBase(DataBaseName:string);
with cmd do
     begin
        CommandText:='IF NOT EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'''+DataBaseName+''') CREATE DATABASE [OFFICIAL]';//self.RzMemo1.Text;
        Execute;                      
     end;第四步 获取备份文件中逻辑文件名对应的物理地址最关键的部分就是对备份文件进行分析,因为在备份的文件中有关于数据库存放的逻辑文件名是SQLSERVER安装目录下,如果你的机器上有这样的路径,可以复制,如果没有,则需要创建这个路径。因为备份文件中这个物理路径是不能修改的(目前我没能修改成功),所以只能按照其要求创建相同的路径。
在强制还原的时候会出现地址不符合,需要将逻辑文件名移动到物理文件名地址下,
如何获取这些路径呢
这里我将获取路径名和还原数据库一并写上
procedure CopyDatabasse(backDatabaseFile:string);
var
  Conn:TADOConnection;
  cmd:TADOCommand;
  DataSet:TADODataSet;
  LogicFilePath:string;
begin
  try
    with cmd do
     begin
        DataSet.Connection:=conn;
        DataSet.CommandText:='RESTORE  FILELISTONLY FROM DISK = '''+ExtractFilePath(application.ExeName)+backDatabaseFile+'''';
        DataSet.Active:=true;
        LogicFilePath:=ExtractFilePath(trim(DataSet.Fields[1].asstring));
        if not DirectoryExists(LogicFilePath) then
        ForceDirectories(LogicFilePath);
        CommandText:='use master RESTORE DataBase Official FROM DISK = '''+ExtractFilePath(application.ExeName)+backDatabaseFile+'''';
        execute;
     end;
      Conn.Close;
      DataSet.Close;
      DataSet.Free;
      cmd.Free;
      conn.Free;
      MessageDlg('数据库被强制复制成功!',mtinformation,[MBOK],0);
   except
          on E:Exception do
          begin
             Conn.Close;
             DataSet.Close;
             DataSet.Free;
             cmd.Free;
             conn.Free;
             MessageDlg('数据库被强制复制失败!',mtinformation,[MBOK],0);
          end;
   end;
end;做的比较粗糙,希望各位前辈帮忙改进!

解决方案 »

  1.   

    学习
    up         up
              upup 
              upup
              upup
               upup
      Upupupupupupupup
      uupupupupupupupupu
    uupupupupupupupupupupu
    upupupupupupupupuuupupup
     upupupupupupupupupupupupupup
     uupupupupupupupuupupupupupup
    upupupupupupupupupupupuupupup
    upupupupupupupupupupupupupuup
    upupupupupupupupupupupupupu
    upupupupupupupupupupupup学习中。。
      

  2.   

    好像可以直接將數據備份到pipe .
    \\localhost\..\backup
    然後再在別的電腦上讀出來.