用ADO编写大型查询时经常出现超时已过期错误
编号:QA002281
建立日期: 1999年12月18日 最后修改日期:2003年7月19日
所属类别:
Q
XU03:
操作系统:WINNT WIN98
编程工具:VB6 SQLSERVER6.5
问题:数据记录数:10万条左右 3个表连接查询。问题:我在用ADO编写一个大型查询时经常出现如下错误:
(对于较小的单表查询不会出现 )
运行时错误: -2147217817 ( 80040231)
超时已过期
我尝试把CommandTimeout 的值改动,但仍很难解决这个问题,不知是否同SQL SERVER 6.5 的系统配置有关。望给予指 教!谢谢!!
源程序代码如下:
Function Test()
Set ServerCNN = New ADODB.Connection
Set rsADO = New ADODB.Recordset
strCnn = pubStrCnn
ServerCNN.Mode = adModeReadWrite
ServerCNN.Open strCnn
ServerCNN.CommandTimeout = 30
pubStrYearDB = "N1999"
pubStrServerName = "baoxi"
pubStrCnn = " Provider=SQLOLEDB.1;Persi0st Security Info=False;User ID=sa;Initial Catalog=" & pubStrYearDB & ";Data Source=" & pubStrServerName
With rsADO
.ActiveConnection = strCnn
''.CursorLocation = adUseClient
.CursorLocation = adUseClient
.LockType = adLockReadOnly
''.LockType = adLockOptimistic
.CursorType = adOpenDynamic
End With
SQL_string =SELECT '成 品 编 号 '=(SUBSTRING(产 品 编 号 ,1,1)+DMHY.含 义 ), _
'数 量 '=SUM(数 量 ) _
from XSH,XSHZ,DMHY _
where XSH.编 号 =XSHZ.编 号 _
AND XSHZ.日 期 BETWEEN '1999-06-13' AND '1999-12-13' _
AND XSHZ.专 卖 店 IN ('BX002','BZ001','CF001','CS01') _
AND XSH.产 品 编 号 LIKE 'B%' _
and dmhy.编 号 ='1' and dmhy.标 志 =substring(产 品 编 号 ,1,1) _
and xshz.月 编 号 not like '%--%' _
GROUP BY SUBSTRING(产 品 编 号 ,1,1)+dmhy.含 义 _
ORDER BY 2 DESC
With rsADO
If .State = adStateOpen Then
.Close
End If
.Source = SQL_string
.Open
End With
End function
A回答:
将sqlserver的temp库扩大(默认2M)。
山鬼的意见:
将TEMP改大可能不对。因为他程序中使用的是客户端游标。本SQL语句太复杂,肯定慢。是否可以尝试将本SQL语句转为SQL_Server中的视图或存储过程。顺便说一句,如果使用客户端游标(adUseClient ),游标类型作成Static好了,还有,你为什么要不加限制返回10万条记录?
liaoxg的意见:
两种方法:
1.使用存储过程,尽量让查询在服务器端运行。
2.尽量优化你的SQL语句,用时间换空间,或用空间换时间,你自己选择
weic的意见:
将commandTimeOut设为0即可。
yxy的意见:
该种情况我曾经遇到,我在50万条数据的SQL SERVER 7的库上做统计,经常会遇到该问题,我已将commandtimeout设为0而且也使用了storeproc,仍然会有该问题,后来采用为用到的字段建索引则问题解决。但速度很慢做一次统计约2-3分钟。
cansum的意见:
查询大量的数据,尽量使用分页处理数据。
探索者的意见:
赞同weic的意见:
将commandTimeOut设为0即可。 有时的SQL语句必须要非常长的执行时间,而且没有优化的必要。比如大量数据的复制..
bozo的意见:
我的做法是建索引,成功。
马骏的意见:
commandTimeOut=0和连接TimeOut=0。这样无论是连接还是执行语言都不会超时了,但是时间如果太长,超过了网络连接时间,那么网络超时还是会导致执行失败,事物回滚,唯一的办法就是不用ADO,用SQL自带的方法编写程序,可以即时得到状态,另一种就是把一个查询分成几个查询,或是优化你的查询吧。
此问题由郝春阳回答。
附加关键字:编程, 源程序, programming, source code, Visual Basic, VB, 数据库, database, query, ActiveX技术, activex, com, ado。
| |
|
|
| |
|
|