如何备份SQL数据与恢复数据,希望给出代码或用DELPHI7编的备份那一整块发到邮箱中,谢谢,虽然分分数不是很多,但还是希望你们能帮忙

解决方案 »

  1.   

    备份:
          ADOQuery2.SQL.Clear;
          ADOQuery2.SQL.Add('BACKUP DATABASE '+backdatabasename+' TO DISK ='+backtofileandpath);
          ADOQuery2.ExecSQL;backdatabasename是你要备份的数据库名,backtofileandpath是要备份成的文件。恢复:
    if OpenDialog1.Execute then
            begin
              dsdbname:='"'+ADOQuery1.fieldbyname('name').asstring+'"';//目的数据库
              dspath:=ExtractFilePath(ADOQuery1.fieldbyname('filename').asstring);//目的数据库文件物理位置
     if Application.MessageBox(
                    pchar('警告,数据库:'+dsdbname+'的原有数据将被覆盖,而且不可恢复确定吗?'),
                    pchar('警告'),MB_YesNo+MB_ICONWARNING+MB_DEFBUTTON2)<>IDYes then exit;          datafilename:=OpenDialog1.FileName;//源数据库文件
              ADOQuery2.close;
              ADOQuery2.SQL.Clear;
              ADOQuery2.SQL.Add('RESTORE FILELISTONLY    FROM DISK =');
              ADOQuery2.SQL.Add(''''+datafilename+'''');
              ADOQuery2.Open;
              adoquery3.SQL.clear;
              adoquery3.SQL.Add('RESTORE DATABASE'+dsdbname);
              adoquery3.SQL.Add(' FROM DISK = '+''''+datafilename+'''');
              ADOQuery3.SQL.Add('WITH  Replace, MOVE '+''''+ADOQuery2.fieldbyname('logicalname').AsString+''''+
                  ' TO '+''''+dspath+ExtractFileName(ADOQuery2.fieldbyname('physicalname').AsString)+'''');
              ADOQuery2.next;
              ADOQuery3.SQL.Add(', Move '+''''+ADOQuery2.fieldbyname('logicalname').AsString+''''+
                  ' TO '+''''+dspath+ExtractFileName(ADOQuery2.fieldbyname('physicalname').AsString)+'''');
              adoquery3.ExecSQL;
              Application.MessageBox(pchar('恢复操作成功!'),'',MB_OK+MB_ICONINFORMATION);
           end;adoquery1的sql语句select * from sysdatabases,用于查询系统的数据库列表。
      

  2.   

    http://community.csdn.net/Expert/topic/3199/3199625.xml?temp=.2329218
      

  3.   

    用ado,bde一样的,不过你记得要把用户进程kill掉
      

  4.   

    把上面的Adoquery改成query就行,不过偶没试过。
      

  5.   

    不明白,什么是用户进程,是SQL里的?为什么要KILL掉
      

  6.   

    偶的代码不需要停掉sqlserver。
      

  7.   

    偶的代码不需要停掉sqlserver。
    不可能,多用户情况下,use master是没用的
      

  8.   

    getit911(Windows转Linux中) ( 等我上班试一下,家里没数据库
      

  9.   

    呵~~好像是我发的帖一样噢。不好意思啊,刚好一个项目剩下这个就可以完工啦,我也急着呢。
    这个我知道,可以不用停。我在以前的帖子找到这段代码,我能看懂:
    with Query1 do  //备份数据库到文件
    begin
     Close; 
     SQL.Clear;
     SQL.Text := 'backup database yourdatabasename to disk = :FileName';
     Parameters.parambyname('FileName').value := strFileName;
     Execsql;
    end;with Query1 do  //从以前的备份中恢复数据库;
    begin
     Close; 
     SQL.clear;
     SQL.text := 'restore database yourdatabasename from disk = :FileName';
     Parameters.parambyname('FileName').value := strFileName;
     Execsql;
    end;可是问题是:
    我要做成用户可以备份多次,每次为一个独立文件(就是SQL里的备份设备吧),文件名为当前系统的日期和时间。路径默认为相对于软件安装目录下的BACKUP目录。
    在恢复时用户可以在下拉框里选择要恢复的独立文件。
    所以,以上代码似乎没有我说的一些功能噢???上面的代码是备份数据库为一个独立文件吗?
    当然最重要的,备份和恢复时都不要停掉sqlserver。
      

  10.   

    即使要停数据库,用
    adoquery1.text:='SHUTDOWN  WITH NOWAIT'
    adoquery1.ExecSQL;
    就行了,kill多可怕,不过偶不知道怎么用代码重新启动sqlserver
      

  11.   

    如果对数据库备份的要求不高的话,可以使用MS SQL数据库自带的bcp命令。
    该命令可以对指定表进行备份、恢复操作。
      

  12.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB, StdCtrls, StrUtils, ComCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        Label1: TLabel;
        Edit1: TEdit;
        Edit2: TEdit;
        Edit3: TEdit;
        Button2: TButton;
        Button4: TButton;
        Button3: TButton;
        SaveDialog1: TSaveDialog;
        ADOQuery_backup: TADOQuery;
        ProgressBar1: TProgressBar;
        Button1: TButton;
        Edit4: TEdit;
        ADOConnection1: TADOConnection;
        Timer1: TTimer;
        procedure FormCreate(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      edit2.Text:=ExtractFilePath(paramstr(0))+'数据库名.MDF';
      edit3.Text:=ExtractFilePath(paramstr(0))+'数据库名.LDF';
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      if savedialog1.Execute then
      begin    edit2.Text:=saveDialog1.FileName;
        if (RightStr(saveDialog1.FileName,4)<>'.MDF')or(RightStr(saveDialog1.FileName,4)<>'.mdf') then
          edit2.Text :=edit2.Text +'.MDF';
      end;
    end;procedure TForm1.Button4Click(Sender: TObject);
    begin
      if savedialog1.Execute then
      begin
        edit3.Text:=saveDialog1.FileName;
        if (RightStr(saveDialog1.FileName,4)<>'.LDF')or(RightStr(saveDialog1.FileName,4)<>'.ldf') then
          edit3.Text :=edit3.Text +'.LDF';
      end;
    end;procedure TForm1.Button3Click(Sender: TObject);
    begin
      try
        if not adoconnection1.Connected then
        begin
          showmessage('请先连接SQL SERVER数据库');
          exit;
        end;
        if (edit2.Text='') or (edit3.Text ='') or (edit1.Text ='') then
        begin
          showmessage('请设置SQL Server数据库路径!');
          exit;
        end;
        
          if messagebox(self.Handle,'创建数据库前请先检查数据库是否已经创建!' + chr(13) + '是否确定创建数据库?','提示',MB_YESNO + MB_ICONWARNING)=IDYES then
          begin
            self.Cursor:=crHourGlass;
            ProgressBar1.Position:=0;
            timer1.Enabled:=true;
            try
            //RESTORE DATABASE TestDB FROM DISK = 'c:\TestDB.dat' WITH MOVE 'TestDB_Data' TO '数据库数据物理文件(TestDB_Data.MDF)路径' , MOVE 'TestDB_Log' TO '数据库数据日记文件(TestDB_Log.LDF)路径'
              ADOQuery_backup.SQL.Add('CREATE DATABASE '+ edit1.Text +' '+
                  'ON ( NAME = ' + edit1.text + '_Data, FILENAME = '+#39+edit2.Text+#39 +') '+
                  'LOG ON '+
                  '( NAME = ' + edit1.Text + '_Log,'+
                  ' FILENAME = '+
                  #39+edit3.Text +#39+')');
              ADOQuery_backup.ExecSQL;
              ADOQuery_backup.SQL.Clear;
              ADOQuery_backup.SQL.Add('restore database '+edit1.Text+' from disk =' +
                  #39  + ExtractFilePath(paramstr(0))+ 'data.bak' + #39 + ' with MOVE ' +
                  #39 + edit1.text + '_Data' +
                  #39 + ' TO ' + #39 + edit2.Text + #39 + ' , MOVE ' + #39 +
                  edit1.Text+'_Log' + #39 + ' TO '+#39+ edit3.Text + #39);
              ADOQuery_backup.ExecSQL;
              ProgressBar1.Position:=ProgressBar1.Max;
              showmessage('创建数据库成功!');
            except
              showmessage('创建数据库失败!请检查与SQL SERVER 服务器的连接!');
              timer1.Enabled:=false;
              ProgressBar1.Position:=0;
            end;
          end;
          
      except on e:ewriteerror do
        begin
          showmessage('创建数据库失败!请检查与SQL SERVER 服务器的连接!');
          timer1.Enabled:=false;
          ProgressBar1.Position:=0;
        end;
      end;
      self.Cursor:=crDefault;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      try
        adoconnection1.Close;
        adoconnection1.ConnectionString:=adodb.promptdatasource(handle,'');
        edit4.Text:=adoconnection1.ConnectionString;
        adoconnection1.Open;
        if adoconnection1.Connected then
          showmessage('数据库连接成功');
      except
        showmessage('数据库连接失败');
      end;
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      if ProgressBar1.Position<ProgressBar1.Max then
        ProgressBar1.Position:=ProgressBar1.Position+1
      else
        timer1.Enabled:=false;
    end;end.无注释,抱歉。
      

  13.   

    其实最可靠的方法是用Delphi调用Sqlserver备份功能,去看看Sqlserver手册就明白了,上面也有好多例子了。
      

  14.   

    恢复也一样,sqlserver有一套数据备份,恢复的命令,用delphi调用就行了
      

  15.   

    getit911(Windows转Linux中) :
        你能做出来发到
      

  16.   

    Shutdown with Nowait 停止SQL SERVER
    winExec(Pchar('sqlservr.exe -c'),sw_Hide) 用以启动SQL SERVER
      

  17.   

    如何检测MS SQL是否已启动?
      

  18.   

    备份和恢复    procedure TForm1.Button1Click(Sender: TObject);    begin      if OpenDialog1.Execute then      begin        try          adoconnection1.Connected:=False;          adoconnection1.ConnectionString:='Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=master;Data Source=FRIEND-YOFZKSCO;'+          'Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=FRIEND-YOFZKSCO;Use Encryption for Data=False;Tag with column collation when possible=False';          adoconnection1.Connected:=True;          with adoQuery1 do          begin            Close;            SQL.Clear;            SQL.Add('Backup DataBase sfa to disk ='''+opendialog1.FileName+'''');            ExecSQL;          end;        except          ShowMessage('±?·Y꧰ü');        Exit;        end;      end;      Application.MessageBox('1§?2?ú£?êy?Y±?·Y3é1|','ìáê?',MB_OK + MB_ICONINFORMATION);    end;    procedure TForm1.Button2Click(Sender: TObject);    begin      if OpenDialog1.Execute then      begin        try          adoconnection1.Connected:=false;          adoconnection1.ConnectionString:='Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=master;Data Source=FRIEND-YOFZKSCO;'+          'Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=FRIEND-YOFZKSCO;Use Encryption for Data=False;Tag with column collation when possible=False';          adoconnection1.Connected:=true;          with adoQuery1 do          begin            Close;            SQL.Clear;            SQL.Add('Restore DataBase sfa from disk ='''+opendialog1.FileName+'''');            ExecSQL;         end;       except         ShowMessage('???′꧰ü');         Exit;       end;     end;     Application.MessageBox('1§?2?ú£?êy?Y???′3é1|','ìáê?',MB_OK + MB_ICONINFORMATION);    end;