CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  数据库及相关技术

请教ADOQuery执行超时已过期问题

楼主gzllh(大眼睛)2006-09-11 09:52:12 在 C++ Builder / 数据库及相关技术 提问

我用ADOQuery执行一条SQL语句,一到30秒系统便报“超时已过期”,本人采取了多种办法仍不得其解:  
   
  方法一:修改对应ADOConnection的ConnectionTimeout、CommandTimeout值为36000.  
  方法二:修改对应ADOConnection的ConnectionTimeout、CommandTimeout值为0.  
  方法三:试图直接修改ADOQuery的ConnectionTimeout、CommandTimeout值,系统报“'TCustomADODataSet::CommandTimeout'   is   not   accessible”。  
   
   
  不知各位大侠有什么好办法没有,请多多指教。  
   
  注:此语句执行影响记录较多(大概有600~700万条记录)。 问题点数:100、回复次数:25Top

1 楼LuoGD(抢第一楼)回复于 2006-09-11 10:56:06 得分 0

这是SQL   Server的超时,与你ADOQuery无关,修改SQL   Server服务器的超时设置Top

2 楼lurel(城市陌生人)回复于 2006-09-11 11:18:28 得分 0

sql语句有问题,建议在sql上入手Top

3 楼wangxintu(Jessie)回复于 2006-09-11 11:25:46 得分 0

我的过程控件也是这样,但设了CommandTimeout为0就没问题了呀!  
  ADOStoredProc1->CommandTimeout   =   0;Top

4 楼gzllh(大眼睛)回复于 2006-09-11 11:57:49 得分 0

请教wangxintu:  
   
  您是用语句:ADOStoredProc1->CommandTimeout   =   0;设置ADOStoredProc的CommandTimeout值吗?  
   
  在我的机上我加了一个ADOStoredProc试了一下,编译链接时报'TCustomADODataSet::CommandTimeout'   is   not   accessible  
   
  请问您是如何设置的?Top

5 楼i_love_pc(杰子)(欢迎加入技术交流QQ群:23640432)回复于 2006-09-11 12:09:05 得分 0

KeepConnection=true;Top

6 楼huzhangyou(信仰(http://www.libing.net.cn))回复于 2006-09-11 13:22:46 得分 0

呵呵  
  广告:  
  服务器开发   博客   www.libing.net.cn  
   
  你的问题应该是   Sql   server的设置问题Top

7 楼gzllh(大眼睛)回复于 2006-09-11 14:21:34 得分 0

请教LuoGD(沃适)   、huzhangyou(信仰(http://www.libing.net.cn))   两位大侠:  
   
  Sql   Server应如何设置?Top

8 楼LuoGD(抢第一楼)回复于 2006-09-11 15:12:02 得分 0

在   SQL   Server   企业管理器中,选中该数据库服务器,右击查看属性,  
  选择“连接”里有个超时设置Top

9 楼gzllh(大眼睛)回复于 2006-09-11 16:10:16 得分 0

我看了一下数据库服务器的设置  
  值是0(unlimited)  
   
  这怎么办哪?各位大侠请快支招。Top

10 楼LuoGD(抢第一楼)回复于 2006-09-11 16:23:46 得分 0

看看你的ConnectionStringTop

11 楼jaffy(小胖猫^_^笨猫先飞)回复于 2006-09-11 16:28:53 得分 0

=0表示没有超时限制Top

12 楼unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回复))回复于 2006-09-11 16:50:35 得分 0

Connection->CommandTimeOut设置好,通常设置时间比较长,最好不要设置为0,如此是生怕什么时候产生死锁,而导致意想不到的结果,只是这个时间设置需要比较长,另外就是将Connection需要执行超长作业时间时,将KeepConnection设置为true.  
  这只是一部分处理,另外一部分是作业的优化,这个是数据库的问题,在这里就不便过多解释,因为需要相应的数据库基础知识,而我对楼主并不了解,所以不多说.某些时间里,恰当的索引是非常必要的.过于复杂的处理,最好使用存储过程,但是需要考虑资源开销以及对并行作业的影响,和当前作业的时间及紧及程度进行平衡分析,而并不是所有大型作业使用存储过程/事务处理都合理.  
   
  另外如果不从数据库的角度去考虑,建议楼主将这几百万笔数据分批处理.如此一来可以解决影应超时问题,二来还能得到个相应的进度状态.Top

13 楼gzllh(大眼睛)回复于 2006-09-15 16:29:01 得分 0

各位大侠还有什么好办法没有,请不吝赐教。Top

14 楼yjkarmon()回复于 2006-09-15 19:58:36 得分 0

所有的说sql要设置的人简直是不懂楼主所说的意思,楼主碰到的问题是怎样在BCB的TADOQuery下的查询若需要很长时间时不让程序报错,因为我也碰到过到这个问题,tadoquery在查询一超过30秒就会报错,你不可能让所有的查询都限制在30秒内完成的,并且这些查询在sql   server的查询分析器上执行是没有任何问题的,所有说要设置sql的参数是没有任何意义的。楼主其实的意思是怎样设置tadoquery的属性才使查询在很长时间内也不会报错,不过我觉得这是bcd的bug,borland不只是BCB会这样的,连在delphi上用tadoquery也是这样的,还有一个令人讨厌的bug:在表里若有一个字段的小数有五位小数的话,则用tadoquery不论是写入或读出都不能使小数后五位有效,也就是写入时,没有第五位小数,读出也是这样,但是用tquery就没有问题!这两个问题困扰我很长时间!!!,我在CSDN问了一百次都没有人能真正解决,唉,borland的产品就是这样的了Top

15 楼yjkarmon()回复于 2006-09-15 20:03:32 得分 0

to楼主:  
  你不用设置sql,   没用的,CommandTimeout是TCustomADODataSet的一个protected属性,不能直接访问的,只能设tadoconnection的CommandTimeoutTop

16 楼yjkarmon()回复于 2006-09-18 21:32:57 得分 0

dingTop

17 楼gzllh(大眼睛)回复于 2006-09-20 10:39:42 得分 0

谢谢yjkarmon()   ,还是您明白俺的意思。  
   
  但CSDN有那么多高手,难道这个问题还真解决不了?Top

18 楼yjkarmon()回复于 2006-09-22 21:34:23 得分 0

dingTop

19 楼hbqc_zh()回复于 2006-09-28 09:01:16 得分 0

我在CSDN问了一百次都没有人能真正解决,唉,borland的产品就是这样的了  
  是这样的,综合了以前大家的回答,贴出来探讨一下:  
   
   
  1、优化查询语句、建立索引、使用存储过程....  
  2、建立索引获赠将数据库表分割。  
  3、SqlCommand.CommandTimeout   =   0  
  4、建立索引表将大表分成多个小表效果会比较明显.(数据量大很有效果,就象搜索引擎)  
  5、在查询分析器中,分别执行三个查询,查看执行计划。然后确定在哪些字段上,建立索引。  
  6、最好还是优化语句,或者将数据处理分割开。  
  7、由于查询的数据量较大,考虑转储过时数据、分区视图等方法减少实际查询的数据量,  
  考虑索引优化来提高查询速度,加上其中还有一个用户自定函数进行一些较复杂的计算,  
  自定义函数的应用需要特别小心,自定义函数的效率是影响很大的,考虑一下不用自定  
  义函数的实现方法。  
  8、考虑分区视图,   对于历史性或者变化很少的数据,   最好设计一个栏位保存自定义函数的运算结果,   查询时直接用这个栏位,   而不是自定义函数  
  9、各表的连接字段都有索引了吗?优化索引几乎是必须做的工作。  
  10、如果是主键,或者已经有索引,或者这个表数据很少,那就不用了,建索引用create   index语句  
  11、  
          (1)一定要用left   join??是不是某些连接可以inner呢?可以的话,就在哪些地方先用inner  
          (2)你连接的时候有没有先后顺序?比如“小表先,大表后”之类的  
          (3)就是楼上各位写的,你在连接的时候,每一个分量是不是用了where?有没有index?index的覆盖率怎么样?  
  12、索引创建时,有单列建索引和多列组合建索引。请问这两种在查询性能上有什么区别吗?  
  13、多个表关联的情况下,关联表的数量最好是5个一组数据集合。  
  Top

20 楼wt_sanlian(雷电)回复于 2006-09-28 20:27:59 得分 0

设置ADOConnection1.CommandTimeOut  
  然后在ADOConnection1.Execute的方法里执行SQL语句Top

21 楼wangxintu(Jessie)回复于 2006-10-13 11:06:41 得分 0

楼主所提问题的现象可以用我所说的办法解决:  
  在KeepConnection=true;的情况下  
  设了ADOStoredProc1->CommandTimeout   =   0;  
  但问题的根本要从多方面解决,我觉得unsigned、hbqc_zh都说的很好。  
  有没有人用异步?  
  Top

22 楼gzllh(大眼睛)回复于 2007-02-15 16:02:29 得分 0

唉,这个问题看来还真把众多高手难倒了,不知有无替代方法。Top

23 楼yjkarmon()回复于 2007-03-14 08:58:59 得分 0

我发觉用连接串:AnsiString   g_ConnectStr("Driver={SQL   Server};Database=GasDB;"  
          "UID=sa;PWD=mamemamehong;Server=(local);");  
  是可以的,但只能用本机,用远程数据库还是没有解决方案Top

24 楼yjkarmon()回复于 2007-03-15 09:52:23 得分 0

dingTop

25 楼daily66(朝夕(不错的BCB群:25415359))回复于 2007-03-23 22:44:10 得分 0

这样的结果有可能是连接数据库失败,请检查连接是否正常Top

相关问题

关键词

得分解答快速导航

  • 帖主:gzllh

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo