sql 备份还原

先记下来,空了去看看

     //开始备份

      with adoquery1 do

       begin

             close;

             sql.Clear;

             sql.Add('Backup database library to disk=:p1 with init');

             parameters.ParamByName('p1').Value:=self.SaveDialog1.FileName;

            try

                Execsql;

               ShowMessage('备份成功!!');

            except

                ShowMessage('备份失败!!');

                exit;

            end;

       end; //End of 备份

  下面来说一下还原,还原与备份不一样,备份不需要关闭数据库,但还原就要先关闭数据库才行.第一次写的

代码如下:

       with ADOQuery1 do

         begin

            Close;

            SQL.Clear;

            SQL.Add('use master alter database library set offline WITH ROLLBACK IMMEDIATE ');

            SQL.Add('restore database library from disk=:p1 with REPLACE');

            SQL.Add('alter database library set online with rollback immediate');

            parameters.ParamByName('p1').Value := self.Edit1.Text;

            try

              ExecSQL;

              ShowMessage('还原成功!!');

            except

              Showmessage('还原失败!!');

              exit;

            end;

         end;

   运行,还原成功!!但是數據庫會變爲脫機狀態,導致其他用戶不能連接。解決的辦法有两种:

 一:用存储过程:

  在master数据库中加入下面的存储过程

if exists(select name from sysobjects where name='usp_restoredb')

 drop proc usp_restoredb

go

/*

exec usp_restoredb "library","D:ak.bak"

*/

create proc usp_restoredb

(

 @dbname  varchar(255),   --数据库名字

 @filepath varchar(255)    --文件路径

)

as

set nocount on

--exec ('use master go')

exec ('alter database '+@dbname+' set offline WITH ROLLBACK IMMEDIATE')

exec ('restore database '+@dbname+' from disk="'+@filepath+'" with REPLACE')

exec ('alter database '+@dbname+' set online with rollback IMMEDIATE')

if @@error<>0

begin

 select 'F','数据库恢复失败'

 return

end

else

begin

 select 'T','数据库恢复成功'

 return

end

运行.

  然后在Delphi的调用这一存储过程,调用过程如下:

//注意:这时的ADOQuery1要连到master数据库,不能连到library数据库!! 

with ADOQuery1 do

    Begin

      Close;

      SQL.Clear;

 // filename是你备份文件的路径加文件名

      SQL.Add('exec usp_restoredb "Library","'+ filename+'"');

      Open;

      if ADOQuery1.Fields[0].AsString='F' then

        ShowMessage('还原失败!!')

      else

        ShowMessage('还原成功!!');

    end;

 运行成功!且library数据库不会变为脱机!

 第二种方法:

  也是运行ADOQuery1来实现,不用存储过程,ADOQuery1一定要连到master数据库,否则就会让library脱机!,代码如下:

begin

  DataModule17.ADOConnection1.Close;//这个是连到library数据库的,所以要先断开

 with ADOQuery1 do

         begin

            Close;

            SQL.Clear;

            SQL.Add('use master alter database library set offline WITH ROLLBACK IMMEDIATE ');

            SQL.Add('restore database library from disk=:p1 with REPLACE');

            SQL.Add('alter database library set online with rollback immediate');

            parameters.ParamByName('p1').Value := self.Edit1.Text; //显示备份文件的路径和文件

            try

              ExecSQL;

              ShowMessage('还原成功!!');

            except

              Showmessage('还原失败!!');

              exit;

            end;

         end;

  end; //End Of 还原数据库

运行成功!library数据库被还原

原文地址:https://www.cnblogs.com/760044827qq/p/3833909.html