曾经在delphi盒子上发布过一个组件,SQL Server 数据备份与恢复组件 v1.0 For D67/CB6,使用方便,但当时我没有提供核心源码,delphi升级后无法编译,给大家带来不便,在此深感表示歉意,现将SQLBackup.pas源码提供如下:
unit SQLBackup;
interface
uses
Windows, Messages, SysUtils, Classes,SQLDMO_TLB,ActiveX,Dialogs;
type
TPercentCompleteEvent = procedure(const Message: String;Percent: Integer) of object;
TMessageEvent = procedure(const Message: String) of object;
TBackupMode = (FullDatabase,Differential);
TRestoreMode = (Restore_Database,Restore_Log);
TSQLBackup = class;
TSQLRestore = class;
TBackupSink = class(TInterfacedObject, BackupSink)
private
function PercentComplete(const Message: WideString; Percent: Integer): HResult; stdcall;
function NextMedia(const Message: WideString): HResult; stdcall;
function Complete(const Message: WideString): HResult;stdcall;
public
Owner:TSQLBackup;
end;
TRestoreSink = class(TInterfacedObject, RestoreSink)
private
function PercentComplete(const Message: WideString; Percent: Integer): HResult; stdcall;
function NextMedia(const Message: WideString): HResult; stdcall;
function Complete(const Message: WideString): HResult;stdcall;
public
Owner:TSQLRestore;
end;
TSQLBackup = class(TComponent)
private
FServer:String;
FDbName:String;
FLoginTimeout:Integer;
FBackupMode:TBackupMode;
FOnPercentComplete:TPercentCompleteEvent;
FOnNextMedia:TMessageEvent;
FOnComplete:TMessageEvent;
pSQLServer: SQLServer;
protected
{ Protected declarations }
public
constructor Create(AOwner: TComponent); override;
procedure Connect();overload;
procedure Connect(UserName:String;Passwrod:String);overload;
procedure Disconnect();
procedure SQLBackup(FileName:String);
published
property Server: String read FServer write FServer;
property DbName: String read FDbName write FDbName;
property LoginTimeout: Integer read FLoginTimeout write FLoginTimeout default 15;
property BackupMode: TBackupMode read FBackupMode write FBackupMode;
property PercentComplete: TPercentCompleteEvent read FOnPercentComplete write FOnPercentComplete;
property NextMedia: TMessageEvent read FOnNextMedia write FOnNextMedia;
property Complete: TMessageEvent read FOnComplete write FOnComplete;
end;
TSQLRestore = class(TComponent)
private
FServer:String;
FDbName:String;
FLoginTimeout:Integer;
FRestoreMode:TRestoreMode;
FReplacedatabase:boolean;
FOnPercentComplete:TPercentCompleteEvent;
FOnNextMedia:TMessageEvent;
FOnComplete:TMessageEvent;
pSQLServer: SQLServer;
FRelocateFiles:String;
protected
{ Protected declarations }
public
constructor Create(AOwner: TComponent); override;
procedure Connect();overload;
procedure Connect(UserName:String;Passwrod:String);overload;
procedure Disconnect();
procedure SQLRestore(FileName:String);
published
property Server: String read FServer write FServer;
property DbName: String read FDbName write FDbName;
property RelocateFiles:String read FRelocateFiles write FRelocateFiles;
property LoginTimeout: Integer read FLoginTimeout write FLoginTimeout default 15;
property RestoreMode: TRestoreMode read FRestoreMode write FRestoreMode;
property Replacedatabase: Boolean read FReplacedatabase write FReplacedatabase;
property PercentComplete: TPercentCompleteEvent read FOnPercentComplete write FOnPercentComplete;
property NextMedia: TMessageEvent read FOnNextMedia write FOnNextMedia;
property Complete: TMessageEvent read FOnComplete write FOnComplete;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('ZygSoft', [TSQLBackup,TSQLRestore]);
end;
// TSQLBackup
constructor TSQLBackup.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
pSQLServer:= CoSQLServer.Create;
FLoginTimeout:=15;
end;
procedure TSQLBackup.Connect();
begin
pSQLServer.LoginTimeout:=FLoginTimeout;
pSQLServer.LoginSecure:=True;
pSQLServer.Connect(FServer,'','');
end;
procedure TSQLBackup.Connect(UserName:String;Passwrod:String);
begin
pSQLServer.LoginTimeout:=FLoginTimeout;
pSQLServer.LoginSecure:=False;
pSQLServer.Connect(FServer,UserName,Passwrod);
end;
procedure TSQLBackup.Disconnect();
begin
pSQLServer.DisConnect;
end;
procedure TSQLBackup.SQLBackup(FileName:String);
var
MyBackup:Backup;
pBackupSink:TBackupSink;
ConnectionPoint: IConnectionPoint;
dwCookie:integer;
begin
MyBackup:=CoBackup.Create;
pBackupSink:=TBackupSink.Create;
pBackupSink.Owner:=self;
(MyBackup as IConnectionPointContainer).FindConnectionPoint(IID_BackupSink, ConnectionPoint);
ConnectionPoint.Advise(pBackupSink,dwCookie);
if FBackupMode=FullDatabase then
MyBackup.action:=SQLDMOBackup_DATABASE //SQLDMOBackup_Database完全备份,SQLDMOBackup_Differential差异
else
MyBackup.action:=SQLDMOBackup_Differential;
MyBackup.Files:='['+FileName+']';
MyBackup.Database:=FDbName;
try
MyBackup.SQLBackup(pSQLServer);
except
on E: Exception do ShowMessage(E.Message);
end;
ConnectionPoint.Unadvise(dwCookie);
end;
function TBackupSink.PercentComplete(const Message: WideString; Percent: Integer): HResult;
begin
if Assigned(Owner.FOnPercentComplete) then Owner.FOnPercentComplete(Message, Percent);
end;
function TBackupSink.NextMedia(const Message: WideString): HResult;
begin
if Assigned(Owner.FOnNextMedia) then Owner.FOnNextMedia(Message);
end;
function TBackupSink.Complete(const Message: WideString): HResult;
begin
if Assigned(Owner.FOnComplete) then Owner.FOnComplete(Message);
end;
// TSQLRestore
constructor TSQLRestore.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
pSQLServer:= CoSQLServer.Create;
FLoginTimeout:=15;
FReplacedatabase:=false;
end;
procedure TSQLRestore.Connect();
begin
pSQLServer.LoginTimeout:=FLoginTimeout;
pSQLServer.LoginSecure:=True;
pSQLServer.Connect(FServer,'','');
end;
procedure TSQLRestore.Connect(UserName:String;Passwrod:String);
begin
pSQLServer.LoginTimeout:=FLoginTimeout;
pSQLServer.LoginSecure:=False;
pSQLServer.Connect(FServer,UserName,Passwrod);
end;
procedure TSQLRestore.Disconnect();
begin
pSQLServer.DisConnect;
end;
procedure TSQLRestore.SQLRestore(FileName:String);
var
MyRestore:Restore;
pRestoreSink:TRestoreSink;
ConnectionPoint: IConnectionPoint;
dwCookie:integer;
p: array [0..255] of Char;
begin
MyRestore:=CoRestore.Create;
pRestoreSink:=TRestoreSink.Create;
pRestoreSink.Owner:=self;
(MyRestore as IConnectionPointContainer).FindConnectionPoint(IID_RestoreSink, ConnectionPoint);
ConnectionPoint.Advise(pRestoreSink,dwCookie);
if FRestoreMode=Restore_Database then
MyRestore.action:=SQLDMORESTORE_DATABASE
else
MyRestore.action:=SQLDMORestore_Log;
MyRestore.Replacedatabase:=FReplacedatabase;
MyRestore.Files:='['+FileName+']';
MyRestore.Database:=DbName;
MyRestore.RelocateFiles:=FRelocateFiles;
try
MyRestore.SQLRestore(pSQLServer);
except
on E: Exception do ShowMessage(E.Message);
end;
ConnectionPoint.Unadvise(dwCookie);
end;
function TRestoreSink.PercentComplete(const Message: WideString; Percent: Integer): HResult;
begin
if Assigned(Owner.FOnPercentComplete) then Owner.FOnPercentComplete(Message, Percent);
end;
function TRestoreSink.NextMedia(const Message: WideString): HResult;
begin
if Assigned(Owner.FOnNextMedia) then Owner.FOnNextMedia(Message);
end;
function TRestoreSink.Complete(const Message: WideString): HResult;
begin
if Assigned(Owner.FOnComplete) then Owner.FOnComplete(Message);
end;
end.