“80040e31,超时已过期”这个问题难道无解吗?

DawnPine 2005-10-17 05:23:13
用VB+ADO通过ODBC访问SQL,一条SQL在查询分析器里用一点问题没有,但在VB里就不一定行,有时能跑下去,有时就报80040e31错

先散200分,如果能解决,给主要解决人再加200
...全文
857 点赞 收藏 18
写回复
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
faysky2 2005-10-18
把你的代码帖出来,大家帮你看看
那样的情况,应该是由于连接超时造成的,把CommandTimeout设大一些
回复
shawls 2005-10-18
另外:

你在sql执行的时候

是使用什么方式?

还有,既然在客户端里面执行通过,可以在conncetion或者command中间进行运行全部sql代码?
回复
shawls 2005-10-18
关键是这个部分:

' 执行命令,在正在执行时显示消息。
cmdChange.Execute , , adAsyncExecute
While (cmdChange.State = adStateExecuting)
Debug.Print "Change command executing...."
Wend



特别是数据比较多的时候,检测是否执行完毕

回复
shawls 2005-10-18

我分析:

楼上说的是一个原因

另外,可以检测一下

参考ADO官方代码

State 属性范例
该范例使用 State 属性,在异步连接正在打开和异步命令正在执行时显示消息。

Public Sub StateX()

Dim cnn1 As ADODB.Connection
Dim cnn2 As ADODB.Connection
Dim cmdChange As ADODB.Command
Dim cmdRestore As ADODB.Command
Dim strCnn As String

' 打开两个异步连接,在连接时显示消息。
Set cnn1 = New ADODB.Connection
Set cnn2 = New ADODB.Connection
strCnn = "Provider=sqloledb;" & _
"Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "

cnn1.Open strCnn, , , adAsyncConnect
While (cnn1.State = adStateConnecting)
Debug.Print "Opening first connection...."
Wend

cnn2.Open strCnn, , , adAsyncConnect
While (cnn2.State = adStateConnecting)
Debug.Print "Opening second connection...."
Wend

' 创建两个命令对象。
Set cmdChange = New ADODB.Command
cmdChange.ActiveConnection = cnn1
cmdChange.CommandText = "UPDATE titles SET type = 'self_help' " & _
"WHERE type = 'psychology'"

Set cmdRestore = New ADODB.Command
cmdRestore.ActiveConnection = cnn2
cmdRestore.CommandText = "UPDATE titles SET type = 'psychology' " & _
"WHERE type = 'self_help'"

' 执行命令,在正在执行时显示消息。
cmdChange.Execute , , adAsyncExecute
While (cmdChange.State = adStateExecuting)
Debug.Print "Change command executing...."
Wend

cmdRestore.Execute , , adAsyncExecute
While (cmdRestore.State = adStateExecuting)
Debug.Print "Restore command executing...."
Wend

cnn1.Close
cnn2.Close

End Sub
回复
lbkbox 2005-10-18
哈哈,将CommandTimeout设成一年也没有用的!
原因可能是,第一个SQL语句还没有执行完成,紧接着又去执行第二个SQL语句
发生这样的原因还是你的SQL语句没有不是很合理.
回复
microsoftTOP 2005-10-18
将CommandTimeout设大一点
回复
conrad_wan 2005-10-18
建议单步调试
回复
fishmans 2005-10-18
等待CODE ing.........
回复
winehero 2005-10-18
说了半天,你代码还没贴出来?
我甚至怀疑你在第二次循环时,切换Command的时,没有为其指定Connection。

看看代码或者是你单步调试检查。。。

回复
vanyard 2005-10-18
那就把Con.CommandTimeout = 1000 改为
Con.CommandTimeout = 0
试一下
回复
DawnPine 2005-10-18
Con.CommandTimeout = 1000
==========
这个已经设了,但完全不起作用,仍然超时

没有用到事务

我的语句是在循环体中,第一次执行时对表T1做操作,能成功
第二次挂靠循环体时对T2操作,T1、T2中记录数大体相当,但此时就会出现80040E31错

把VB生成的语句放到查询分析器里执行,总是能成功,仅花费20多秒。
回复
lbkbox 2005-10-17
这跟记录集大小没有关系,和你的SQL SERVER 设置有关系,
最好把你的SQL 语句和你的有关表贴出来看看吧
回复
kingnew 2005-10-17
将SQL语句放在企业管理器中执行一下,企业管理器会帮你将SQL语句格式化一下,再贴到程序中试试。
回复
kingnew 2005-10-17
将CommandTimeout设大一点,我记得我以前程序里有一句SQL语句执行大约需要2分钟呢。
回复
province_ 2005-10-17
sp_configure 'remote query timeout', 1000
把远程操作等待时间改为1000秒
回复
wangtopcool 2005-10-17
这应该是sql server连接超时导致的吧
查一下有什么其他事务导致服务器挂起
回复
daisy8675 2005-10-17
有没有用到事务?
回复
weiweiplay 2005-10-17
是不是因为你打开记录集比较大,所以要的时间比较长?你设置一下
Dim Con As New ADODB.Connection
Con.CommandTimeout = 1000
试一下
回复
发动态
发帖子
VB基础类
创建于2007-09-28

7449

社区成员

VB 基础类
申请成为版主
社区公告
暂无公告