SQL Server 数据库恢复(100分)

  • 主题发起人 dylwordtop
  • 开始时间
D

dylwordtop

Unregistered / Unconfirmed
GUEST, unregistred user!
我把与表关联的数据控件放在datamodel上,其中用于恢复数据库的控件为
Tadoconnection,TADOCommand1,恢复数据库之前我已把Tadoconnection的connected属性
设为false;但它还说我数据库还在打开,不能恢复,应该怎么办?
 
之前虽然connected为false,但你在TADOCommand1。execute时,肯定又会变为true,
在连接一个数据库时肯定不能恢复,所以出现错误提示。
解决办法,将Tadoconnection连接到另外一个数据库,如sqlserver的master,
 
告诉你也没用用,除非这个程序退出,否则他与数据库总是连接的,即使将连接关闭
或重新连接到master都无效.这是我在d6+madac2.7下测试的结果.
方法,在主程序中调用这一功能时,主动关闭主程序,启动专门的恢复程序(启动后延时
3秒左右以让主程序关闭),这样才能恢复成功,否则等待你的就是数据库正在使用的提示.
 
to lynu
开什么玩笑,我从来都是在主程序中备份、恢复一气呵成,一个Tadoconnection只能
连接一个数据库,其它数据都是可以备份与恢复了,除非还有其它连接。
你启用专门恢复程序,难道不连接数据库就能恢复。
 
我现在的情况正如 lynu 所说
如果我不登录直接调出主窗体恢复数据是可以的,
但如果我恢复数据之前只要有打开过数据库就是不行的,
我现在恢复时就不用Tadoconnection了,
直接将tadocommand1的connectstring连接到数据库master
恢复之前也把Tadoconnection的connected设为false
但还是错误,说是数据库打开着
但不知为什么Access是可以的
 
数据库恢复时要求独占操作,其他的连接比如打开了企业管理器等必须关闭程序才能执行恢复
 
我关了,
 
当然要动点手脚才行。示例如下:
var cc:widestring;
c1:string;
begin
cc:=Tadoconnection.connectionstring;
c1:=Tadoconnection.name;
Tadoconnection.connected:=true;
......
Tadoconnection.conected:=false;
Tadoconnection.free;
//这是关键
adocommand.commandtext:='backup ....

with Tadoconnection.create(self)do
begin
connectionstring:=cc;
name:=c1;
..........
end;
 
我当时做了一个存储过程,假如说要恢复
create procedure sp_RestoreDb
Restore Database MyDataBase from Disk='FileName'
但是,这个存储过程千万不要做成你所应用的数据库下的存储过程,因为数据库恢复的时候
需要仅仅一个用户dbo Only,但是你一运行数据库,那它就不是dbo only了。因此,千万不要把
恢复数据库的存储过程做在你该数据库下,我当时是作在Master下了
 

Tadoconnection.conected:=false;
Tadoconnection.free;
//这是关键
我也认为就你这两句就可以了,但是还是恢复不了,
你说是不是因为我把太多的数据控件放在了 datamodel上的原因
 
跟太多控件没有什么关系,
1 确信关闭操作数据库的软件,如”企业管理器“,”查询分析器“
2 没有其它ado或bde连接到该数据库。
错误信息是不是没有变“数据库正忙..........
 
myname, 你真是太厉害了
我加了datam.adocon.free;
就可以了,但是
 with datam.adocon.Create(self)do
begin
ConnectionString := cc;
Name :=c1;
end;
datam.adocon.Connected := false;
adocon控件却创建不回来了。
我是datam是datamodel
 
with Tadoconnection.create(self)do
//才对,我上面有呀
begin
ConnectionString := cc;
Name :=c1;
end;

另外,我只是举例,需要保存的属性还有很多,如CommandTimeout等,就看你的实际情况了。
 
对啊,但它执行到with datam.adocon.Create(self)do
就出错了
 
完整代码(未调试)
var
i:integer;
mm:Tmemorystream;
list1,list2:Tlist;
begin
self.ADOConnection1.Connected:=false;
mm:=Tmemorystream.create;
list1:=Tlist.create;
//存放与之相连的adocommand列表
list2:=Tlist.create;
//存放与之相连的customadodataset列表
try
mm.WriteComponent(ADOConnection1);
//保存ADOConnection1
for i:=0 to ADOConnection1.commandcount-1do
list1.Add(ADOConnection1.commands);
for i:=0 to ADOConnection1.DataSetCount-1do
list2.Add(ADOConnection1.datasets);
freeandnil(ADOConnection1);
//释放ADOConnection1,同时也释放连接
//备份语句

ADOConnection1:=TADOConnection.Create(self);
//重建ADOConnection1
mm.Seek(0, soFrombegin
ning);
ADOConnection1:=mm.readcomponent(ADOConnection1) as TADOConnection;
ADOConnection1.Connected:=true;
for i:=0 to list1.Count-1do
Tadocommand(list1).Connection:=ADOConnection1;
//重建连接
for i:=0 to list1.Count-1do
TCustomADODataSet(list1).Connection:=ADOConnection1;
//重建连接
finally
freeandnil(mm);
freeandnil(list1);
freeandnil(list2);
end;
end;
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1089391
我几天前特意做了一个这样的测试,free也没有用.
我认为是ado缓冲了连接.即使你在程序中关闭了连接甚至free了这个连接控件,
ado仍然保持了与数据库的连接所以你的恢复不成功.
我所说的专门的恢复程序不连接要恢复的数据,是连接master数据.然后执行恢
复指定的数据库.
ado连接sqlserver,第一次作一般要几百ms,而后面重新连接的时间都是0ms,我
一向就认为ado缓冲了连接,事实上在程序退出前根本就没有断开.
 
lynu, 是的以前我在断点datam.ADOCommand1.Execute;
停留一段时间就可以了,然后就一直可以恢复了
我现在用myname 的方法前下子是好的,现在又不可以了
我真的不知怎么办了
 
我想在datam.ADOCommand1.Execute前面加一段程序
让时间在datam.ADOCommand1.Execute前面暂停一段时间
应该怎么写啊
 
我的程序中有备份与恢复功能.恢复操作也在主程序中执行,但执行这个操作前会主动
关闭主程序,在恢复成功和失败后会重新启动主程序,无非是一个重新登录的问题.
单独做一个这样的恢复程序,加上一些密码参数,也就是说只有加上指定的参数才会执行
这样保证只有你的主程序才能调用他,而直接运行他就什么都不做(主窗体也不显示).基
本上可以够用.

 
延迟可以用sleep,或者写一个循环
use mmsystem;
var
t1,t2:integer;
begin
t1:=timeGetTime();
while(true)do
begin
if timeGetTime()>(t1+3000) then
break;
Application.ProcessMessages;
end
end;
 
顶部