操作系统: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 的事件?
开发工具: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 的事件?
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.