高分求助:ADO中SQL语句执行超时(求58个字段的全年平均值)(200分)

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

DickWu

Unregistered / Unconfirmed
GUEST, unregistred user!
Delphi中我用ADO(ADOConnection 和 ADOQuery)取MS SQL2000 personal版数据库中的数据
平均值,但一直超时。程序用在工业监控方面,数据库中的数据是每隔10秒insert保存一次,
全年的数据量很大。

SQL语句是:
select avg(a1),avg(a2)...............,avg(a58),sum(a1),sum(a2)
from Database1
where (recorddatetime>=setdatatime1)
and (recorddatetime<=setdatetime2)

每次执行以上语句,总是超时。
各位大侠帮帮我吧
我的操作系统平台是win98SE,设置ADOConnection的CommandTimeout和ConnectTimeOut
也是这样。
 
试试存储过程
 
同意sportsman的,用存储过程吧!!
 
在建一个库,保存累加值,对avg要保存除数
在添加数据时处理
 
同意用存储过程,因为它们是预编译的。
 
可是平均值的计算日期范围是在查询时才确定的呀,可能是一年(最大),也可能是一年中的
任一时间段.
 
存储过程可以用参数
 
服务器和应用都在单机上运行,用存储过程能提高速度?
 
SQL语句是可不可以优化一下啊!
select avg(a1),avg(a2)...............,avg(a58),sum(a1),sum(a2)
from 表名 group by 字段名
where recorddatetime between setdatatime1 and setdatetime2
另不知你在MS SQL2000 personal里面执行速度怎么样,假如没有超时的话,那么肯定是
你的程序有问题
 
你換一個別的SQL語句進去試試看﹐若還是超時便是你設置問題﹐若不超時便是你的SQL問題﹐
再相應改進。
 
如果DELPHI5的话,建议你先把SQL语句在
EXPLORER中执行一次,看看能不能正常执行!
如果有问题的话,再说
 
如果日期范围减小到一定程度的话,就不超时,在MS SQL2000 personal里面执
行速度也很慢,不过比程序运行要块一点,所以肯定是数据量太大的原因。
慢就慢吧,可是老是弹出超时对话框,然后就中断SQL,害的我老是查不到
数据,TADOQuery又不能设置超时,设置ADOConnection的又没用,
虽然我现在直接在VCL原码中把default值由30改到360,可是这样程序中又不
能灵活设置了,我本想根据查询的时间段的大小在程序中设置该超时值的。

本来是用普通的paradox数据库的,可是由于以台机器上同时有几个程序读取该
数据库,后来就改用MS SQL2000 Persenal了。想不到怎么麻烦。


 
//一个月过去了,竟然没有人再讨论:
解决方法是使用ADODataSet,不要用ADOQuery,就可以设置超时
 
DELPHI的adoquery,adotable在 commandtimeout上是个BUG,您应该使用adocommand或者
adodataset,将adocommand、adodataset的commandtimeout的时间设置为0或者大的数字即可!
这也是我遇到你那样的问题后,很久才解决的,我一直追踪到DELPHI的低层才发现。
 
DickWu:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
 
多人接受答案了。
 
后退
顶部