zoukankan      html  css  js  c++  java
  • 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数据库被还原

  • 相关阅读:
    微信小程序:模板消息推送提示{“errcode”:41030,”errmsg”:”invalid page hint: [gP1eXXXXXX]”}
    Linux 定时执行shell脚本命令之crontab
    Ubuntu16.04系统下 解决“无法获得锁 /var/lib/dpkg/lock -open (11:资源暂时不可用)、无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?”的方法
    微信小程序:wx.request之post请求后端无法获取数据的问题
    jQuery获取浏览器参数
    Chrome等浏览器下出现net::ERR_BLOCKED_BY_CLIENT的解决办法
    Thinkphp3.2.3框架下封装公共的函数,例如封装CURL函数来获取接口数据
    Select下拉列表选择自动提交form表单数据
    一步一步从原理跟我学邮件收取及发送 5.C语言的socket示例
    一步一步从原理跟我学邮件收取及发送 4.不同平台下的socket
  • 原文地址:https://www.cnblogs.com/760044827qq/p/3833909.html
Copyright © 2011-2022 走看看