关于数据库恢复.   
当Adoquery的connectionstring的测试链接成功,sql语句可以在查询分析器执行成功时,为什么程序在执行这行代码adoquery1.execsql;时会停滞20秒(正常情况应是没有停滞),20秒过去后,没有报错,程序继续往入执行代码,直到事件结束。而数据库并没有恢复。     值得一提的是,我把这个数据库恢复的模块提出来单独执行,Adoquery的connectionstring不变
   Adoquery1.text 不变.
   数据库恢复成功。
  再一点,这个数据库恢复模块应该是没有改动过的,有一天,突然出现上述情况
(在这句代码停滞adoquery1.execsql).且数据库不恢复.
  
  这是为什么呀~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~?我愿倾家荡产出分,请大家指教,帮在下解决这个问题。不然,老板会干掉我的.
顺便给出QQ号吧:19273210

解决方案 »

  1.   

    不要使用adoquery1执行语句,改用Adocommand
      

  2.   

    一般做数据库恢复之类的操作需要先断开所有连接然后再进行的。不知道你的SQL语句中有没有这个处理,如果没有的话会有些问题。
    :)
      

  3.   

    首先帮楼主顶一下,我也遇到了和楼主类似的问题,用的是 ADOQuery ,望大虾指点指点我呀。
    楼主是数据库恢复时候出现不能恢复的问题,而我是选择了备份保存路径之后,点击“数据库备份”,提示“备份成功”,然而进入指定的保存文件夹里面后,却发现数据库没有被备份,我想可能是这几句SQL语句有问题,我顺便把源代码贴出来吧,望各位大虾赐教:
    ==============================================
    ==============声明部分========================
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, RzTabs, ComCtrls, StdCtrls, RzLabel, DB, ADODB,IniFiles;type
      TForm1 = class(TForm)
        RzPageControl1: TRzPageControl;
        TabSheet1: TRzTabSheet;
        TabSheet2: TRzTabSheet;
        RzLabel1: TRzLabel;
        Search_B: TButton;
        Copy_B: TButton;
        Edit1: TEdit;
        RadioButton1: TRadioButton;
        RzLabel2: TRzLabel;
        Edit2: TEdit;
        Button1: TButton;
        Button2: TButton;
        Label1: TLabel;
        OpenDialog1: TOpenDialog;
        SaveDialog1: TSaveDialog;
        StatusBar1: TStatusBar;
        ADOQuery1: TADOQuery;
        procedure FormCreate(Sender: TObject);
        procedure Search_BClick(Sender: TObject);
        procedure Copy_BClick(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
      db_name,pathname,path1,db_name1:string;
      usename,psw,connectionstring:string;    { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
    implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    var
         databasename:string;
         Ini:TIniFile;begin
      Ini:=TInifile.Create(ExtractFileDir(Application.ExeName)+ '\config.INI' );
       try
        usename:=Ini.ReadString('sqlconfig','usename','sa');
        psw:=Ini.Readstring('sqlconfig','psw','1');
        connectionstring:=Ini.ReadString('Connection_set','connectionstring','');
    //    Persist SecurityInfo:=Ini.Readboolean('Form','Persist SecurityInfo',False);
    //    User ID:=Ini.ReadString('Form','usename','sa');
    //    Initial Catalog:=Ini.ReadString('Form','usename','data_student');
    //    Data Source:=Ini.ReadString('Form','usename','LIXIANYING');
    //    Password:=Ini.ReadString('Form','usename','1');
        Ini.Free;
       Finally   databasename:='data_student';
       db_name:='data_student';
       StatusBar1.Panels.Items[0].Text:='系统备份/恢复 面板'; end;
       if (Trim(Edit1.text)<>'') then
       Copy_B.enabled:=True;
        ADOQuery1.ConnectionString :=  connectionstring;
    end;
    ==============================================================
    ==============================================================
    ==============================================   
     其中 “备份”面板就两个按钮
    procedure TForm1.Search_BClick(Sender: TObject);begin
       if SaveDialog1.Execute then
       begin
          Edit1.Text:=SaveDialog1.FileName;
          pathname:=SaveDialog1.filename;
          db_name:=Copy(ExtractFileName(pathname),1 ,Length(ExtractFileName(pathname))-4);
       end;
    end;procedure TForm1.Copy_BClick(Sender: TObject);begin
      { ADOQuery1:=TADOQuery.create(self);}   Copy_B.Enabled:=false;
       StatusBar1.Panels.Items[0].Text:='备份中';
       if(Trim(db_name)<>'') then
       begin
          ADOQuery1.Close;
          ADOQuery1.SQL.Clear;
          ADOQuery1.SQL.Text:='use master EXEC  sp_addumpdevice ''disk'','+QuotedStr(connectionstring)+','+QuotedStr(Trim(pathname));
          try
          //ADOQuery1.Open;
          ADOQuery1.ExecSQL;
          except
          ShowMessage('数据库发生异常');
          StatusBar1.Panels.Items[0].Text:='备份失败!';
          Abort;
          end;
          ADOQuery1.Close;
          ADOQuery1.SQL.Clear;
          ADOQuery1.SQL.Text:='use master EXEC sp_addumpdevice ''disk'','+QuotedStr(db_name)+','+QuotedStr(Trim(pathname));
          try
          ADOQuery1.ExecSQL;
          showmessage('备份成功');
          StatusBar1.Panels.Items[0].Text:='备份成功';
          except
          ShowMessage('数据库发生异常');
          StatusBar1.Panels.Items[0].Text:='备份失败';
          Abort;
          end;      showmessage('应用程序将重启,以完成备份');
          ADOQuery1.Free;
          Application.Terminate;
       end;
    end;=================
    望高手不吝赐教呀。 我的QQ 529998673 先谢谢各位大虾了
      

  4.   

    给你一个数据库恢复的函数:
    function pRestoreDataBase(DataBaseName, BackupFileName : String) : Boolean;
    var
      TempTab : TADOQuery;
    begin
      TempTab := TADOQuery.Create(nil);
      try
        TempTab.Connection := pvADOConn;
        TempTab.SQL.Add('USE master');
        TempTab.SQL.Add('RESTORE DATABASE '+DataBaseName+' FROM DISK = '''+BackupFileName+'''');
        TempTab.ExecSQL;
        TempTab.Free;
        Result := True;
      except
        TempTab.Free;
        Result := False;
      end;
    end;
      

  5.   

    Procedure HYUANDatebaseOk(DBname ,SoureName : String);
    begin
      with SqlCommand do
      begin
        CommandText:='use Master';//
        Execute;
        ClearMSSQLUser(DBname);
        CommandText:='execute sp_helpdevice';//系统存储过程
        Execute;
        CommandText:='Restore database '+DBname+'  From disk='''+SoureName+''' with replace';
        Execute;
      end;
    end;//DBname 备份库名称  //SoureName 那个盘Procedure BakUpdatebameOk(BkDBname,MDFileStr : String);
    begin
      with SqlCommand do
      begin
        CommandText:='use Master';
        Execute;
        CommandText:='execute sp_helpdevice';//系统存储过程
        Execute;
        CommandText:='backup database '+BkDBname+' to disk='''+MDFileStr+''' with init';
        Execute;
        CommandText:='Use '+BkDBname;
        Execute;
      end;
    end;
      

  6.   

    procedure ClearMSSQLUser(DBname : String);
    var
      SelectQuery : TAdoQuery;
      ClearProUser : TAdoQuery;
    begin
      try
        SelectQuery :=TAdoQuery.Create(nil);
        ClearProUser:=TAdoQuery.Create(nil);
        SelectQuery.Connection :=SqlConnection;
        ClearProUser.Connection:=SqlConnection;
        SelectQuery.SQL.Clear;
        ClearProUser.SQL.Clear;
        SelectQuery.SQL.Add('select * from dbo.sysobjects where '+
                            'id = object_id(N''[dbo].[p_killspid]'') and OBJECTPROPERTY(id, N''IsProcedure'') = 1');
        SelectQuery.Open;
        if SelectQuery.Eof then
        begin
          SqlCommand.CommandText:='create proc p_killspid ' +
                                   '@dbname sysname        ' +
                                   'as  '+
                                   'declare @s nvarchar(1000) ' +
                                   'declare tb cursor local for ' +
                                   'select s=''kill ''+cast(spid as varchar) '+
                                   'from master..sysprocesses '+
                                   'where dbid=db_id(@dbname) '+
                                   'open tb '+
                                   'fetch next from tb into @s  '+
                                   'while @@fetch_status=0   '+
                                   'begin  '+
                                   '  exec(@s)  '+
                                   '  fetch next from tb into @s  '+
                                   'end '+
                                   'close tb '+
                                   'deallocate tb';
          SqlCommand.Execute;
        end;
        SqlCommand.CommandText:='exec p_killspid  '''+DBname+'''';
        SqlCommand.Execute;
      finally
        freeandnil(SelectQuery);
        freeandnil(ClearProUser);
      end;
    end;