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

时间:2021-11-26 11:08:55
用VB+ADO通过ODBC访问SQL,一条SQL在查询分析器里用一点问题没有,但在VB里就不一定行,有时能跑下去,有时就报80040e31错

先散200分,如果能解决,给主要解决人再加200

18 个解决方案

#1


是不是因为你打开记录集比较大,所以要的时间比较长?你设置一下
    Dim Con As New ADODB.Connection
    Con.CommandTimeout = 1000
试一下  

#2


有没有用到事务?

#3


这应该是sql server连接超时导致的吧
查一下有什么其他事务导致服务器挂起

#4


sp_configure 'remote query timeout', 1000
把远程操作等待时间改为1000秒

#5


将CommandTimeout设大一点,我记得我以前程序里有一句SQL语句执行大约需要2分钟呢。

#6


将SQL语句放在企业管理器中执行一下,企业管理器会帮你将SQL语句格式化一下,再贴到程序中试试。

#7


这跟记录集大小没有关系,和你的SQL SERVER 设置有关系,
最好把你的SQL 语句和你的有关表贴出来看看吧

#8


把你的代码帖出来,大家帮你看看
那样的情况,应该是由于连接超时造成的,把CommandTimeout设大一些

#9


Con.CommandTimeout = 1000
==========
这个已经设了,但完全不起作用,仍然超时

没有用到事务

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

把VB生成的语句放到查询分析器里执行,总是能成功,仅花费20多秒。

#10


那就把Con.CommandTimeout = 1000 改为
Con.CommandTimeout = 0
试一下

#11


说了半天,你代码还没贴出来?
我甚至怀疑你在第二次循环时,切换Command的时,没有为其指定Connection。

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

#12


等待CODE ing.........

#13


建议单步调试

#14


将CommandTimeout设大一点

#15


哈哈,将CommandTimeout设成一年也没有用的!
原因可能是,第一个SQL语句还没有执行完成,紧接着又去执行第二个SQL语句
发生这样的原因还是你的SQL语句没有不是很合理.

#16



我分析:

楼上说的是一个原因

另外,可以检测一下

参考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

#17


关键是这个部分:

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



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

#18


另外:

你在sql执行的时候

是使用什么方式?

还有,既然在客户端里面执行通过,可以在conncetion或者command中间进行运行全部sql代码?

#1


是不是因为你打开记录集比较大,所以要的时间比较长?你设置一下
    Dim Con As New ADODB.Connection
    Con.CommandTimeout = 1000
试一下  

#2


有没有用到事务?

#3


这应该是sql server连接超时导致的吧
查一下有什么其他事务导致服务器挂起

#4


sp_configure 'remote query timeout', 1000
把远程操作等待时间改为1000秒

#5


将CommandTimeout设大一点,我记得我以前程序里有一句SQL语句执行大约需要2分钟呢。

#6


将SQL语句放在企业管理器中执行一下,企业管理器会帮你将SQL语句格式化一下,再贴到程序中试试。

#7


这跟记录集大小没有关系,和你的SQL SERVER 设置有关系,
最好把你的SQL 语句和你的有关表贴出来看看吧

#8


把你的代码帖出来,大家帮你看看
那样的情况,应该是由于连接超时造成的,把CommandTimeout设大一些

#9


Con.CommandTimeout = 1000
==========
这个已经设了,但完全不起作用,仍然超时

没有用到事务

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

把VB生成的语句放到查询分析器里执行,总是能成功,仅花费20多秒。

#10


那就把Con.CommandTimeout = 1000 改为
Con.CommandTimeout = 0
试一下

#11


说了半天,你代码还没贴出来?
我甚至怀疑你在第二次循环时,切换Command的时,没有为其指定Connection。

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

#12


等待CODE ing.........

#13


建议单步调试

#14


将CommandTimeout设大一点

#15


哈哈,将CommandTimeout设成一年也没有用的!
原因可能是,第一个SQL语句还没有执行完成,紧接着又去执行第二个SQL语句
发生这样的原因还是你的SQL语句没有不是很合理.

#16



我分析:

楼上说的是一个原因

另外,可以检测一下

参考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

#17


关键是这个部分:

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



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

#18


另外:

你在sql执行的时候

是使用什么方式?

还有,既然在客户端里面执行通过,可以在conncetion或者command中间进行运行全部sql代码?