zoukankan      html  css  js  c++  java
  • Delphi用SQLDMO实现带进度条的SQL Server数据库备份

       1.首先,要导入对象库定义:

        打开Delphi,Project菜单->Import Type Library...,在列表框中找到"Microsoft SQLDMO Object
    Library”,然后生成一个Unit单元文件,默认为SQLDMO_TLB,然后在备份窗体中加入引用:SQLDMO_TLB,还有ComObj。

       2.在窗体中加入一个进度条,将总进度设置为100(或在代码中设置)。

       3.定义接口:

     

    type
      TBackupSink=class(TInterfacedobject,backupsink)//实现接口
      function PercentComplete(const Message: WideString; Percent: Integer): HResult; stdcall;
      function NextMedia(const Message: WideString): HResult; stdcall;
      function Complete(const Message: WideString): HResult; stdcall;

     4.实现

    function TBackupSink.PercentComplete(const Message: WideString; Percent: Integer):HResult;
    begin
      frmBackupDatabase.prgCompress.PartsComplete:=percent;
      result:=0;
      frmBackupDatabase.Refresh;
      Forms.Application.ProcessMessages;
    end;

    function TBackupSink.NextMedia(const Message: WideString):HResult;
    begin
      result:=-1;
    end;

    function TBackupSink.Complete(const Message: WideString):HResult;
    begin
      result:=1;
      messageBox(Forms.Application.handle,'成功备份数据!','提示信息',MB_ICONINFORMATION);
    end;

    5.下面是备份按钮的操作

    注意,引入的SQLDMO_TLB单元有许多类型定义和Delpgi冲突,如Application,建议在原Delphi的类型前加上限定,如Forms.Application。

    procedure TfrmBackupDatabase.BackupDatabaseBySQLDMO;
    var
      MySQLServer:SQLServer;
      MyBackUp:BackUp2;
      MyBackSink:TBackupSink;
      FInterfaceConnection:integer;
      BS:TBackupSink;
    begin
      prgCompress.TotalParts:=100;
      BS:=TBackupSink.Create;
      MySQLServer:=coSQLServer.Create;
      MyBackUp:=coBackUp2.Create;
      MySQLServer.Connect(DBServer,DBUser,DBPassword);
      MyBackUp.Database:=edtDatabaseName.Text;
      MyBackUp.Initialize:=true;
      MyBackUp.PercentCompleteNotification:=1;
      MyBackUp.Action:=0;//0完整备份,1差异备份,2文件组备份,3日志备份
      MyBackUp.Files:=edtFileName.Text;
      InterfaceConnect(MyBackUp, IID_BackupSink, BS, FInterfaceConnection);//关键是这里
      MyBackUp.SQLBackup (MySQLServer);
      InterfaceDisconnect(MyBackUp, IID_BackupSink,FInterfaceConnection);//
    end;
    function TBackupSink.PercentComplete(const Message: WideString; Percent: Integer):HResult;
    begin
      frmBackupDatabase.prgCompress.PartsComplete:=percent;
      result:=0;
      frmBackupDatabase.Refresh;
      Forms.Application.ProcessMessages;
    end;

    function TBackupSink.NextMedia(const Message: WideString):HResult;
    begin
      result:=-1;
    end;

    function TBackupSink.Complete(const Message: WideString):HResult;
    begin
      result:=1;
      messageBox(Forms.Application.handle,'成功备份数据!','提示信息',MB_ICONINFORMATION);
    end;
  • 相关阅读:
    《区块链100问》第51集:区块链资产有匿名性
    《区块链100问》第52集:区块链资产能去中心化记账
    《区块链100问》第53集:区块链资产不可复制
    day 5 模块导入、常用模块os shutil sys commands subprocess hashlib json pickle zipfile traceback random datetime pathlib
    apache中配置php支持模块模式、cgi模式和fastcgi模式的实验
    day3--集合、文件操作、字符编码与转换、函数(递归,lambda,filter,map)、字典排序
    练习题目 :if for while else range、xrange、zip
    解决mySQL占用内存超大问题
    my.cnf重要配置参数说明
    chattr与lsattr命令详解
  • 原文地址:https://www.cnblogs.com/GarfieldTom/p/2672841.html
Copyright © 2011-2022 走看看