有关在程序中实现SQL Server数据库备份的问题。想在程序中实现数据库的备份与恢复。希望将代码写的详细一些。谢谢!

解决方案 »

  1.   

    用企业管理器作一次备份,用事件探查器截获sql语句,然后在程序中实现就可以了。
      

  2.   

    http://expert.csdn.net/Expert/topic/2577/2577001.xml?temp=7.671535E-03
      

  3.   

    刚刚写的一段代码:试试看应该可以的
    unit back_database;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls,Buttons,
      Gauges, DB, ADODB, ExtCtrls, StdCtrls;type
      TF_bakdatabase = class(TForm)
        StatusBar1: TStatusBar;
        Panel1: TPanel;
        SpeedButton4: TSpeedButton;
        SpeedButton5: TSpeedButton;
        Timer1: TTimer;
        T_back: TTabSheet;
        Label1: TLabel;
        Image1: TImage;
        Cmb_database_name: TComboBox;
        r_bfxx: TRadioGroup;
        GroupBox1: TGroupBox;
        b_addpath: TSpeedButton;
        b_delete: TSpeedButton;
        ListBox1: TListBox;
        r_cx: TRadioGroup;
        g_jd: TProgressBar;
        S_deletedevice: TADOStoredProc;
        S_adddevice: TADOStoredProc;
        Q_backdatabase: TADOQuery;
        S_database: TSaveDialog;
        T_page: TPageControl;
        ado_connect_restore: TADOConnection;
        Q_database_name: TADOQuery;
        procedure FormShow(Sender: TObject);
        procedure b_addpathClick(Sender: TObject);
        procedure b_deleteClick(Sender: TObject);
        procedure SpeedButton4Click(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
        procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
        procedure SpeedButton5Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
       function dbpath():string;
      public
        { Public declarations }
      end;var
      F_bakdatabase: TF_bakdatabase;
      bh:string;
      bfsb:string;
    implementationuses Unit3;{$R *.dfm}
    function TF_bakdatabase.dbpath:string;
    begin
    result:=extractfilepath(application.ExeName)+'\db.txt';
    end;
    procedure TF_bakdatabase.FormShow(Sender: TObject);
    begin
    listbox1.Items.LoadFromFile(dbpath());
    listbox1.ItemIndex:=0;
    with  Q_database_name  do
            begin
              close;
              sql.Clear ;
              sql.Add('select name from master.dbo.sysdatabases'); //从master.dbo.sysdatabases系统库中获得数据库名称列表
              open;
            end;
          cmb_DataBase_name.Items.Clear;
          while  not  Q_database_name.Eof  do                       //添加数据库列表进列表框
            begin
              cmb_DataBase_name.Items.Add(Q_database_name.fieldbyname('name').AsString );
              Q_database_name.Next ;
            end;
          cmb_DataBase_name.ItemIndex:=0;      if  cmb_DataBase_name.Items.Count<=0  then
              exit;
    cmb_database_name.ItemIndex:=cmb_database_name.Items.Count-1 ;
    q_database_name.Close;
    end;procedure TF_bakdatabase.b_addpathClick(Sender: TObject);
    begin
    if s_database.Execute  then
        listbox1.Items.Append(s_database.FileName);
        listbox1.ItemIndex:=listbox1.Items.Count-1 ;
        listbox1.Items.SaveToFile (dbpath());end;procedure TF_bakdatabase.b_deleteClick(Sender: TObject);
    begin
    if application.MessageBox('你确定要删除该备份吗?','请注意...',mb_iconwarning+mb_yesno)=idyes then
       begin
       if fileexists(trim(listbox1.Items.Strings[listbox1.Itemindex])) then
         deletefile(trim(listbox1.Items.Strings[listbox1.Itemindex]));
       listbox1.Items.Delete(listbox1.ItemIndex);
       listbox1.Items.SaveToFile (dbpath());
       listbox1.Itemindex:=0;
       end;
    end;procedure TF_bakdatabase.SpeedButton4Click(Sender: TObject);
    var
    back_sql_Str:string;
    begin
    g_jd.Position :=0;
    if (trim(cmb_database_name.Text)='master') and (r_bfxx.ItemIndex=1) then
      begin
      application.MessageBox('系统库Master不能进行增量备份,只能进行完全备份!','曲靖师范学院机房管理系统:',mb_iconerror+mb_ok);
      exit;
      end;
    back_sql_str:='backup database '+trim(cmb_database_name.Text)+' to disk='+''''+trim(listbox1.Items.Strings[listbox1.Itemindex])+''''+' with stats=10';
    statusbar1.Panels[0].Text :='正在进行备份,请稍后...';
    if listbox1.Items.Count=0 then
    begin
    application.MessageBox('你还没有进行备份路径的选择!','机房系列系统:',mb_iconwarning+mb_ok);
    exit;
    end;
    screen.Cursor:=crHourGlass;
    if r_bfxx.ItemIndex=1 then
     begin
      back_sql_str:='backup database '+trim(cmb_database_name.Text)+' to disk='+''''+trim(listbox1.Items.Strings[listbox1.Itemindex])+''''+' with  DIFFERENTIAL,stats=10';//增量备份
     if r_cx.ItemIndex =1 then
     back_sql_str:='backup database '+trim(cmb_database_name.Text)+' to disk='+''''+trim(listbox1.Items.Strings[listbox1.Itemindex])+''''+' with init,DIFFERENTIAL,stats=10';//增量备份
     end
    else
    if r_cx.ItemIndex =1 then
     back_sql_str:='backup database '+trim(cmb_database_name.Text)+' to disk='+''''+trim(listbox1.Items.Strings[listbox1.Itemindex])+''''+' with init,format,DIFFERENTIAL,stats=10';//增量备份timer1.Enabled :=true;
    with q_backdatabase do
       begin
       close;
       sql.Clear ;
       sql.Add(back_sql_str);
        ExecSQL;
       timer1.Enabled :=false;
       g_jd.Position :=100;
       screen.Cursor:=crarrow;
       statusbar1.Panels[0].Text :='备份完成';
       close;
       end;end;
    procedure TF_bakdatabase.Timer1Timer(Sender: TObject);
    begin
    g_jd.Position :=g_jd.Position +13;
    end;procedure TF_bakdatabase.FormCloseQuery(Sender: TObject;
      var CanClose: Boolean);
    begin
    g_jd.Position :=0;
    statusbar1.Panels[0].Text:='';
    end;procedure TF_bakdatabase.SpeedButton5Click(Sender: TObject);
    begin
    close;
    end;procedure TF_bakdatabase.FormCreate(Sender: TObject);
    begin
    ado_connect_restore.ConnectionString:=dm1.ADOConnection1.ConnectionString;
    ado_connect_restore.Connected:=true;
    end;end.