在Delphi中备份和还原数据库

原创 2006年05月29日 17:15:00

在Delphi中备份和还原数据库

作者:蔡华

日期:2006.5.29

  前几天高中同学叫我帮他改一下毕业设计,要改的部分是对MSSQL数据库的备份与还原,刚开始的时候还不知道怎么做,便到网上去找了一点资料来看,于是就动起手来写了,备份还算简单,但是在写还原的时候遇到了些问题,费了好大力才解决,这里要感谢coach兄,是他帮我搞定了,下面来说一下如何完成的.

    由于同学第一次写程序,所以和我刚刚接触程序一样,在每个窗口都用些ADOConnection,ADOQuery之类的,窗口的名字也是从Form1到Form16,单元的名字也是从Unit1到Unit16,看起来都头大啊!!所以一定要注意单元,窗口及变量的名命!!

    备份的代码如下:

     //开始备份

      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;
   运行,还原成功!!但是.....SQL中Library数据库变为脱机了!!导致程序的其他部份不能连到数据库上去!!怎么办??然后又去CSDN发帖子问了一下,回答的人不多,也没有解决到问题.在搜索这类问题的时候发现竟然还有人和我一样遇到了这类问题,其中有个叫sxtdxvb的回答了他的问题,并说出了他的QQ,哈哈,马上加他.在他的帮助下,答案终于浮出水面.我总结了一下,有两种方法:

 一:用存储过程:

  在master数据库中加入下面的存储过程(sxtdxvb提供)

if exists(select name from sysobjects where name='usp_restoredb')
 drop proc usp_restoredb
go
/*
exec usp_restoredb "library","D:/dbbak.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数据库被还原,不会脱机,哈哈!

以上程序仅供参考,有什么不对的地方还请多多指教!

MySQL详解(20)-----------数据库备份和还原

数据备份: 使用mysqldump命令备份 mysqldump命令可以讲数据库中的数据备份成一个文本文件。表结果和表中的数据将存储在生成的文本中。mysqldump的工作原理很简单。他先查出需要备...
  • u011225629
  • u011225629
  • 2015年07月07日 10:21
  • 5058

ADO.NET 备份还原数据库

献给需要的人和我自己
  • bdbql
  • bdbql
  • 2015年06月16日 16:29
  • 438

Java备份和还原MySQL数据库

网络上有很多关于Java程序中备份和还原
  • zhangyihui1986
  • zhangyihui1986
  • 2014年09月23日 11:57
  • 4256

SQL Server 2008数据库创建,备份,还原图解及注意点

SQL Server 2008数据库创建,备份,还原图解及注意点 一、新建数据库 步骤1:点击“新建数据库”。 步骤2:输入数据库名称,设置数据库文件保存位置(注意点:最好自己设置数...
  • haiross
  • haiross
  • 2014年06月30日 11:22
  • 17900

DBA必知的mysql备份与还原

DBA必知的mysql备份与还原
  • mine_song
  • mine_song
  • 2017年04月26日 09:20
  • 458

Navicat Premium实现mysql数据库备份 还原

网上有很多类似数据库备份还原的资料,但是大多不是纯命令操作不够实用,对于初学者来说很难看懂不易操作,这里我详细给大家介绍下基于Navicat Premium数据库工具的数据库的备份和还原。 首先点击文...
  • zhige_j
  • zhige_j
  • 2015年11月13日 14:01
  • 6485

mysql CMD命令备份和还原数据库

如果要备份和还原数据库, 需要用到 mysql安装目录下bin目录中 的其他的一些命令了 . 备份使用 mysqldump 还原使用 mysql 数据的备份 : 使用mysql...
  • liu911025
  • liu911025
  • 2017年07月02日 16:27
  • 664

如何将sql2000备份数据库还原到sql2008中

 今天安装了sql server2008,于是乎想将自己原来在2000下备份的数据还原一番,很自然想到了2000下还原数据库的方法:     1、先新建一个数据库,有些同学说这个新建的数据库在...
  • builderwfy
  • builderwfy
  • 2017年07月29日 15:00
  • 1245

DB2的备份(backup)和恢复(RESTORE)数据库方法

一、备份(backup)数据库 1、离线全备份 1)、首先确保没有用户使用DB2:  db2 list applications for db sample  2)、停掉数据库并重新启...
  • zwhfyy
  • zwhfyy
  • 2014年06月06日 10:59
  • 13388

推荐一个PHP的MySQL数据库备份还原类

在GitHub上发现的一个PHP的MySQL数据库备份还原类,写的不错,目测用的人似乎不多,好东西就推广一下哈导出后的sql文件格式如下:-- -- MySQL database dump -- Cr...
  • kof820
  • kof820
  • 2015年07月11日 09:31
  • 6208
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在Delphi中备份和还原数据库
举报原因:
原因补充:

(最多只允许输入30个字)