热情软件屋

 

用ADO编写大型查询时经常出现超时已过期错误


编号:QA002281
建立日期: 1999年12月18日 最后修改日期:2003年7月19日
所属类别:

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

回答:

    将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

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio