在Delphi中备份和还原数据库
2006-05-29 17:15
555 查看
在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数据库被还原,不会脱机,哈哈!
以上程序仅供参考,有什么不对的地方还请多多指教!
作者:蔡华
日期: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数据库被还原,不会脱机,哈哈!
以上程序仅供参考,有什么不对的地方还请多多指教!
相关文章推荐
- Delphi数据库的备份及还原
- delphi数据库的备份及还原
- 数据库备份与还原(Delphi)
- SQL数据库还原时备份集中的数据库备份与现有的数据库不同的解决办法
- sql server 数据库备份还原
- SQL Server 数据库备份和还原
- 已备份数据库的磁盘结构版本为611,服务器支持版本为539,无法还原或升级数据库
- 数据库的备份与还原(vb.net代码篇)
- sqlserver 2005数据库还原与备份
- 数据库的备份与还原
- AD数据库的备份与还原
- 数据库异地备份还原
- 教你如何用SQL备份和还原数据库
- 利用ZRM(lvm+binlog方式)进行数据库备份及还原
- 数据库备份与还原
- Sql Server 备份/还原数据库
- 用批处理写的:数据库备份还原工具
- 数据库的备份和还原
- mssql 数据库与日志的备份 与还原
- .net mssql自己封装的 备份/还原 数据库方法