操作系统:Windows XP
开发工具:Delphi 7问题由来:
    Microsoft SQL Sever 2000数据库备份恢复,通常有以下两种方法:1、使用T-SQL语句。2、使用 Microsoft SQLDMO Object Library 中的 _Restore 接口、_Backup 接口!前者使用方便,但是没有办法获得恢复/备份进度(原理上是可以的,但是不知道具体怎么做,还望高人指点!),后者可以获得恢复/备份进度,可以使用两个接口的 PercentComplete 事件,但是在DELPHI写这样的程序的时候出现了问题!问题描述:
    在DELPHI使用 Import Type Library 导入 Microsoft SQLDMO Object Library 类型库,默认会在DELPHI的安装目录Imports目录下声称SQLDMO_TLB.pas的单元文件!恢复数据库代码如下:procedure TForm1.BtnDBRestoreClick(Sender: TObject);
var
  oSQLServer:_SQLServer;
  oRestore:_Restore;
begin
  oSQLServer:=CoSQLServer.Create;
  oSQLServer.HostName:='.';
  oSQLServer.LoginSecure:=true;
  oSQLServer.Connect('.','sa','Password');
  oRestore:=CoRestore.Create;
  oRestore.Files:='X:\DatabaseBackupFileName';
  oRestore.Database:='DatabaseName';
  oRestore.SQLRestore(oSQLServer);
  ShowMessage('Datebase restore complete!');
end;请问各位大虾,怎么样来响应 _Restore 接口 PercentComplete 的事件?

解决方案 »

  1.   

    没有哪位高手回答吗?!给参考资料有分哟!呵呵,是接口回调的机制?!但是小弟不知道具体怎么搞得!我也研究了很长的时间,大家可以参考IConnectionPointContainer、IConnectionPoint接口!
      

  2.   

    已经解决~unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, SQLDMO_TLB, StdCtrls, ComCtrls, ComObj, ActiveX;type
      TRestoreSink=class (TInterfacedObject, RestoreSink)
      private
        { Private declarations }
      public
        function PercentComplete(const Message: WideString; Percent: Integer): HResult; stdcall;
        function NextMedia(const Message: WideString): HResult; stdcall;
        function Complete(const Message: WideString): HResult; stdcall;
      end;  TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      oSQLServer:_SQLServer;
      oRestore:_Restore;
      oIRestoreSink:RestoreSink;
      Connection:integer;
      CPC: IConnectionPointContainer;
      CP: IConnectionPoint;
    begin
      OutputDebugString('OutputDebugString...');
      oSQLServer:=CoSQLServer.Create;
      oSQLServer.HostName:='.';
      oSQLServer.LoginSecure:=true;
      oSQLServer.Connect('.','sa','xxxx');
      oRestore:=CoRestore.Create;
      oRestore.Files:='I:\xxxxx';
      oRestore.Database:='xxxxxxxxxx';  oIRestoreSink:=TRestoreSink.Create;  Connection := 0;
      if Succeeded(oRestore.QueryInterface(IConnectionPointContainer, CPC)) then
        if Succeeded(CPC.FindConnectionPoint(IID_RestoreSink, CP)) then
          CP.Advise(oIRestoreSink, Connection)
        else
          ShowMessage('Find connection point failed!')
      else
          ShowMessage('Find connection container failed!');  oRestore.SQLRestore(oSQLServer);  CP.Unadvise(Connection);  showmessage('Datebase restore complete!');
    end;{ TRestoreSink }function TRestoreSink.Complete(const Message: WideString): HResult;
    begin
      OutputDebugString('Complete...');
    end;function TRestoreSink.NextMedia(const Message: WideString): HResult;
    beginend;function TRestoreSink.PercentComplete(const Message: WideString;
      Percent: Integer): HResult;
    begin
      OutputDebugString(PChar(inttostr(Percent)));  
    end;end.