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

时间:2021-09-06 11:13:25
我用ADOQuery执行一条SQL语句,一到30秒系统便报“超时已过期”,本人采取了多种办法仍不得其解:

方法一:修改对应ADOConnection的ConnectionTimeout、CommandTimeout值为36000.
方法二:修改对应ADOConnection的ConnectionTimeout、CommandTimeout值为0.
方法三:试图直接修改ADOQuery的ConnectionTimeout、CommandTimeout值,系统报“'TCustomADODataSet::CommandTimeout' is not accessible”。


不知各位大侠有什么好办法没有,请多多指教。

注:此语句执行影响记录较多(大概有600~700万条记录)。

25 个解决方案

#1


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

#2


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

#3


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

#4


请教wangxintu:

您是用语句:ADOStoredProc1->CommandTimeout = 0;设置ADOStoredProc的CommandTimeout值吗?

在我的机上我加了一个ADOStoredProc试了一下,编译链接时报'TCustomADODataSet::CommandTimeout' is not accessible

请问您是如何设置的?

#5


KeepConnection=true;

#6


呵呵
广告:
服务器开发 博客 www.libing.net.cn

你的问题应该是 Sql server的设置问题

#7


请教LuoGD(沃适) 、huzhangyou(信仰(http://www.libing.net.cn)) 两位大侠:

Sql Server应如何设置?

#8


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

#9


我看了一下数据库服务器的设置
值是0(unlimited)

这怎么办哪?各位大侠请快支招。

#10


看看你的ConnectionString

#11


=0表示没有超时限制

#12


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

另外如果不从数据库的角度去考虑,建议楼主将这几百万笔数据分批处理.如此一来可以解决影应超时问题,二来还能得到个相应的进度状态.

#13


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

#14


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

#15


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

#16


ding

#17


谢谢yjkarmon() ,还是您明白俺的意思。

但CSDN有那么多高手,难道这个问题还真解决不了?

#18


ding

#19


我在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个一组数据集合。

#20


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

#21


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

#22


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

#23


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

#24


ding

#25


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

#1


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

#2


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

#3


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

#4


请教wangxintu:

您是用语句:ADOStoredProc1->CommandTimeout = 0;设置ADOStoredProc的CommandTimeout值吗?

在我的机上我加了一个ADOStoredProc试了一下,编译链接时报'TCustomADODataSet::CommandTimeout' is not accessible

请问您是如何设置的?

#5


KeepConnection=true;

#6


呵呵
广告:
服务器开发 博客 www.libing.net.cn

你的问题应该是 Sql server的设置问题

#7


请教LuoGD(沃适) 、huzhangyou(信仰(http://www.libing.net.cn)) 两位大侠:

Sql Server应如何设置?

#8


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

#9


我看了一下数据库服务器的设置
值是0(unlimited)

这怎么办哪?各位大侠请快支招。

#10


看看你的ConnectionString

#11


=0表示没有超时限制

#12


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

另外如果不从数据库的角度去考虑,建议楼主将这几百万笔数据分批处理.如此一来可以解决影应超时问题,二来还能得到个相应的进度状态.

#13


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

#14


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

#15


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

#16


ding

#17


谢谢yjkarmon() ,还是您明白俺的意思。

但CSDN有那么多高手,难道这个问题还真解决不了?

#18


ding

#19


我在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个一组数据集合。

#20


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

#21


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

#22


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

#23


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

#24


ding

#25


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