恢复数据库出错,折腾了一个上午。求教TADOConnection的连接机制(问题解决了,请关注的朋友进来看看) (300分)

  • 主题发起人 萧月禾
  • 开始时间
通过编程将YouDatabase改名为MyDatabase
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

如何改名呢??
 
to bingjian:
forss说的是数据库重命名,是否能做到我还不知道,但如果连删数据库都做到了,则
表示那连接已经断开,则也不必用这偏方了 :)
另外,程云说的办法我也试过了,还是不能解决这个问题
今晚再来研究。。。。。。
 
我想这是connection pool起了作用
 
这种情况我也遇到过,查看是不是和表之间的关系有关???
 
》》bingjian偏方有点危险呀,毕竟删数据库不是件小事

你可以先把原数据库更名啊,等恢复出来的数据库连接上以后在删除就保险了啊
 
看看这有没有用,Delphi5里面的ADO的属性介绍!
Indicates the current state of the ADO connection.
//指出ADO连接的当前状态
property State: TObjectStates;

Description

Read State at runtime to determine the activity being performed,
if any, by the connection at a specific point in time. Activity
status includes the command component connecting to a data store,
executing a connection, fetching rows for a recordset, sitting idle
but open, and sitting idle and closed.
 
对了,忘记问是恢复前不能断开还是恢复中出现你说的情况,如果是恢复前的话使用
Connected:=False;正常是应该可以切断和数据库链接的,如果没有切断,应该是在程序
中有访问数据库的资源还存在。如果在恢复中出现你说的情况,可能和表的关系有关。
 
TO:飘摇客
你的意思是不是在Connected:=False之前,要把所有的ADOTABLE、ADOQUERY等其他ado控件
CLOSE之后,然后在CONNECTED:=FALSE呢?

刚才试了一下,不行,FAINT!

继续想!
 
是不是你在设计的时候把adoconnection的active设为true;
设计时把它设为false试一试?
 
没有做过
来听听课吧 [:)]
 
ADOConnection没有Active属性,只有Connected属性,在设计的源码打开的情况下它
的确是保持着连接,甚至设为false也不行,但我调试的时候是把源码关闭,直接运行
应用程序执行的,用各种办法都不能把ADOConnection的连接中断,除了Free

但我还原了数据库后还要运行其他模块的,即,这个连接要重新建立,所以它不能Free
重新创建也不可,它在主数据模块中,其他所有模块的数据连接都连着它,重新创建
要一个个赋值,这不可能
 
我认为与ado的连接缓冲有关。我以前作sqlserver与interbase的连接速度比较时就发现
ado的第二次第三次连接时间根本就是0,也就是说即使将ADOConnection与数据库断开.
他也根本没有与数据库断开连接

我作测试的时候将TADOConnection Free掉也没有用。而你居然可以,你已经够幸运了.
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1089391
 
如果是单用户,用以下的方法可以,但如果是多用户,自己试验一下吧,我也不知道可不可以。
1. ADOConnection1 连接你的业务数据库。
2. ADOConnection2 连接 MASTER 数据库。
3. ADOCommand1.Connection := ADOConnection2;
假设你的数据库名为: DataBaseName
Button.OnClick:
begin
ADOConnection1.Connected := False;
ADOCommand1.CommandText := 'BACKUP DATABASE DataBaseName TO DISK = ' + #39 + 'C:/KKK.BAK' + #39;
ADOCommand1.Execute;
ADOCommand1.CommandText := 'ALTER DATABASE DataBaseName SET OFFLINE WITH ROLLBACK IMMEDIATE';
ADOCommand1.Execute;
ADOCommand1.CommandText := 'RESTORE DATABASE DataBaseName FROM DISK = ' + #39 + 'C:/KKK.BAK' + #39;
ADOCommand1.Execute;
ADOCommand1.CommandText := 'ALTER DATABASE DataBaseName SET ONLINE WITH ROLLBACK IMMEDIATE';
ADOCommand1.Execute;
ADOConnection1.Connected := True;
ADOTable1.Active := true;
end;
 
萧大侠,除了ADO,要不用SQL-DMO试试.
问题我来学习.
 
以前也打算用SQL-DMO来实现数据库的备份和还原
后来从Sql Server 的帮助上看好象和直接执行sql来实现的方式效果差不多
而直接用sql来做又比较简单,所以当时就没选择它了

当然,如果用它能实现自然也好[:)]

 
呵呵,问题解决了,感谢zhihuali师兄的帮助
这里是通过在Master中执行SET OFFLINE的方法将指定的数据库关闭,同时回滚
当中的事务,使连接断开,然后进行备份,完成后再将连接打开。

这里还有一些要注意的小地方
1、当设TAdoConnection的Connected属性为False时,所有连接它的并且已经打
开的数据集对象会被关闭(但不会发送错误),如果是在多个业务模块同时打
开操作的情况下进行数据还原,提示用户关闭或自动关闭其他业务模块,当然
,一般这样的情况也不会有。在还原了数据库后,将Connected属性为True,即
可和原来一样正常操作。
2、在执行SET OFFLINE是会比较慢,有死机之嫌,别忘了提示用户等待

3、有些朋友用TAdoConnection的时候不是通过设置其ConnectString,而是用
设置参数然后Open()的方式,则不能通过设置Connected来关闭打开,而用
Close和Open

再次感谢大家的帮忙,帖子过几天再结束,大家也来看看这种方法,相信还有
人会碰到和我类似的麻烦

另外,刚刚一个女生发了个网址给我,挺逗的,大家也看看轻松一下罢[:)]
http://go6.163.com/huangxiaoxie/giabo.htm
 
TO : 萧月禾
>>2、在执行SET OFFLINE是会比较慢,有死机之嫌,别忘了提示用户等待
如果你在 MASTER 数据库中建立存储过程来实现 OFFLINE ,是很快的!忘了说清楚。
 
>这里是通过在Master中执行SET OFFLINE的方法将指定的数据库关闭,同时回滚
>当中的事务,使连接断开,然后进行备份,完成后再将连接打开。
说错了一点,是“然后进行数据恢复”,而不是“备份”,sorry
 
现在终于打开了,唉,我迟到了。
不过知识又长进了一步。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
顶部