程序通过bde连接数据库,有什么好的办法,在程序和数据库断开时可以立即知道

时间:2021-10-23 04:33:28
程序通过bde连接数据库
有什么好的办法,在程序和数据库断开时可以立即知道
TDatabase有个Connected属性,但我测试,比如把主机的网络禁用,Connected属性并不会变成false
Disconnect事件也不会发生

有什么好的办法可以知道程序和数据库断开了

19 个解决方案

#1


开一个定时器,用TQuery执行"select N'Test Connection ...'"

#2


那你需要有个心跳变量,每隔一段时间,就检查连接一次

#3


引用 2 楼 jaffy 的回复:
那你需要有个心跳变量,每隔一段时间,就检查连接一次

知道啊,就是怎么个检查法好

#4


引用 1 楼 unsigned 的回复:
开一个定时器,用TQuery执行"select N'Test Connection ...'"

用TQuery执行什么?

#5


引用 4 楼 SHHMing 的回复:
引用 1 楼 unsigned 的回复:
开一个定时器,用TQuery执行"select N'Test Connection ...'" 
 
用TQuery执行什么?

引用 1 楼 unsigned 的回复:
开一个定时器,用TQuery执行 "select N'Test Connection ...'"

#6


select N'Test Connection ...


这个可以直接执行是么,我试试看

#7


void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  Query1->Close();
  Query1->SQL->Text = "select N'Test Connection...";
  try{
    Query1->ExecSQL;
  }catch(...){
    //断开处理
  }
}

#8


我就是这样做的,但是即使连上的,我调这个
Query1->ExecSQL;
也是出异常

#9


我数据库是
sql server 2005

#10


什么数据库?把那个大写的N去掉看.

#11


帮顶

#12


引用 9 楼 SHHMing 的回复:
我数据库是 
sql server 2005

query有连接好数据库吗?

#13


ding

#14


引用 12 楼 unsigned 的回复:
引用 9 楼 SHHMing 的回复:
我数据库是 
sql server 2005 
 
query有连接好数据库吗?

连接好了

我把那个大写的N去掉看看

#15


还是不行,我用了其它的语句是可以的
select * from mytable;
mytable 是我数据库中的一个表

还有这种循环查询对程序会有较大影响吗
我这个程序是24小时跑的

#16


引用 15 楼 SHHMing 的回复:
还是不行,我用了其它的语句是可以的 
select * from mytable; 
mytable 是我数据库中的一个表 

还有这种循环查询对程序会有较大影响吗 
我这个程序是24小时跑的

具体为什么不行,我不是太清楚问题所在。使用一个定时器隔一段时间执行一下是不会有太多影响的。对于TDatabase,需要通过Session来隔离。也就是你这个查询需要在独立的Session当中执行以便与其它作业隔离开来,从而达到不影响的目的。

#17


对于TDatabase,需要通过Session来隔离。也就是你这个查询需要在独立的Session当中执行以便与其它作业隔离开来,从而达到不影响的目的。
---------
麻烦解释下这个怎么可以做到

#18


我查了下帮助
To associate a dataset component with a different session, SessionName must match the SessionName property of an existing session component that is also used by the database component with which this dataset is associated.

是不是我用另外一个TDatabase对象,然后把我的TQuery对象关联到这个TDatabase,专门用来循环查询是否是连接正常的?

#19


引用 18 楼 SHHMing 的回复:
我查了下帮助 
To associate a dataset component with a different session, SessionName must match the SessionName property of an existing session component that is also used by the database component with which this dataset is associated. 

是不是我用另外一个TDatabase对象,然后把我的TQuery对象关联到这个TDatabase,专门用来循环查询是否是连接正常的?

如果你的程序是一个单线程的则使用同一个Database不会有问题,但是,如果是多线程的,则需要进行隔离。
Session实际上相当于连接池,是一个命名的对象。比如你现在有10个线程同时工作,那么你就可以创建10个命名Session,比如根据ThreadID命名,然后你就可以很方便的在本线程当中在任何时间都只使用属于自己的Session,而不会导致线程之间的冲突。

#1


开一个定时器,用TQuery执行"select N'Test Connection ...'"

#2


那你需要有个心跳变量,每隔一段时间,就检查连接一次

#3


引用 2 楼 jaffy 的回复:
那你需要有个心跳变量,每隔一段时间,就检查连接一次

知道啊,就是怎么个检查法好

#4


引用 1 楼 unsigned 的回复:
开一个定时器,用TQuery执行"select N'Test Connection ...'"

用TQuery执行什么?

#5


引用 4 楼 SHHMing 的回复:
引用 1 楼 unsigned 的回复:
开一个定时器,用TQuery执行"select N'Test Connection ...'" 
 
用TQuery执行什么?

引用 1 楼 unsigned 的回复:
开一个定时器,用TQuery执行 "select N'Test Connection ...'"

#6


select N'Test Connection ...


这个可以直接执行是么,我试试看

#7


void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  Query1->Close();
  Query1->SQL->Text = "select N'Test Connection...";
  try{
    Query1->ExecSQL;
  }catch(...){
    //断开处理
  }
}

#8


我就是这样做的,但是即使连上的,我调这个
Query1->ExecSQL;
也是出异常

#9


我数据库是
sql server 2005

#10


什么数据库?把那个大写的N去掉看.

#11


帮顶

#12


引用 9 楼 SHHMing 的回复:
我数据库是 
sql server 2005

query有连接好数据库吗?

#13


ding

#14


引用 12 楼 unsigned 的回复:
引用 9 楼 SHHMing 的回复:
我数据库是 
sql server 2005 
 
query有连接好数据库吗?

连接好了

我把那个大写的N去掉看看

#15


还是不行,我用了其它的语句是可以的
select * from mytable;
mytable 是我数据库中的一个表

还有这种循环查询对程序会有较大影响吗
我这个程序是24小时跑的

#16


引用 15 楼 SHHMing 的回复:
还是不行,我用了其它的语句是可以的 
select * from mytable; 
mytable 是我数据库中的一个表 

还有这种循环查询对程序会有较大影响吗 
我这个程序是24小时跑的

具体为什么不行,我不是太清楚问题所在。使用一个定时器隔一段时间执行一下是不会有太多影响的。对于TDatabase,需要通过Session来隔离。也就是你这个查询需要在独立的Session当中执行以便与其它作业隔离开来,从而达到不影响的目的。

#17


对于TDatabase,需要通过Session来隔离。也就是你这个查询需要在独立的Session当中执行以便与其它作业隔离开来,从而达到不影响的目的。
---------
麻烦解释下这个怎么可以做到

#18


我查了下帮助
To associate a dataset component with a different session, SessionName must match the SessionName property of an existing session component that is also used by the database component with which this dataset is associated.

是不是我用另外一个TDatabase对象,然后把我的TQuery对象关联到这个TDatabase,专门用来循环查询是否是连接正常的?

#19


引用 18 楼 SHHMing 的回复:
我查了下帮助 
To associate a dataset component with a different session, SessionName must match the SessionName property of an existing session component that is also used by the database component with which this dataset is associated. 

是不是我用另外一个TDatabase对象,然后把我的TQuery对象关联到这个TDatabase,专门用来循环查询是否是连接正常的?

如果你的程序是一个单线程的则使用同一个Database不会有问题,但是,如果是多线程的,则需要进行隔离。
Session实际上相当于连接池,是一个命名的对象。比如你现在有10个线程同时工作,那么你就可以创建10个命名Session,比如根据ThreadID命名,然后你就可以很方便的在本线程当中在任何时间都只使用属于自己的Session,而不会导致线程之间的冲突。

#20