03年编写的基于SQLDMO开发能够轻易的备份和恢复及安装数据库支持显示进度的组件源代码

该组件为 Delphi 开发者提供了 SQL Server 数据库的备份与恢复功能,支持完全备份及差异备份,同时提供了进度通知等实用特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

曾经在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.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值