尝试运行短过程时查询超时已过期

Posted

技术标签:

【中文标题】尝试运行短过程时查询超时已过期【英文标题】:Query timeout expired when trying to run a short procedure 【发布时间】:2013-11-14 13:02:30 【问题描述】:

这是我的连接字符串:

Global Const strConn As String = _
    "PROVIDER=SQLNCLI10;" & _
    "P-SSWORD=blahblah;" & _
    "USER ID=blahblah;" & _
    "INITIAL CATALOG=blah;" & _
    "DATA SOURCE=blah;" & _
    "CONNECT TIMEOUT=0;" & _
    "COMMAND TIMEMOUT=0" & _
    "PACKET SIZE=4096;"

下面是简单的代码:

Sub MoveDataUsingADO()

Dim cn As Object
Dim cm As Object
Dim rs As Object

    'get in touch with the server
    'Create ado objects.
Set cn = CreateObject("ADODB.Connection")
cn.connectiontimeout = 0
cn.Open strConn
cn.CommandTimeout = 0

Set cm = CreateObject("ADODB.Command")
Set cm.ActiveConnection = cn
cm.CommandType = 4 'adCmdStoredProc

Set rs = CreateObject("ADODB.Recordset")
Set rs.ActiveConnection = cn


cm.CommandText = "WH.dbo.ourProcName"
With wb.Sheets("Data")
    .Activate
    .Range(.Cells(2, 1), .Cells(.Cells(.Rows.Count, 2).End(Excel.xlUp).Row + 1, .Cells(1, .Columns.Count).End(Excel.xlToLeft).Column)).ClearContents
End With
With rs
    .Open Source:=cm.Execute '<=====errors here===========
     wb.Sheets("Data").Cells(wb.Sheets("Data").Rows.Count, 1).End(Excel.xlUp)(2, 1).CopyFromRecordset rs
    .Close      'close connection
End With
...
...

在上面标记的地方,我收到以下错误:

我不明白 - 该过程需要 55 秒才能运行,并且在我的 vba 中我已将超时设置为 0... 我认为这迫使他们过期?

【问题讨论】:

【参考方案1】:

您是否尝试过在命令上明确设置超时?

cm.CommandTimeout = 0

而不是在连接上设置它。我认为连接超时处理的是它允许您在拒绝之前尝试建立连接多长时间,而命令超时是您的命令必须执行多长时间。

【讨论】:

+1 感谢您提供此信息 - cm.CommandTimeout = 120 是解决方案。【参考方案2】:

您知道执行查询需要多长时间吗?会不会有与超时时间不同的问题?

您应该尝试像这样在命令对象上设置超时:

cm.CommandText = "WH.dbo.ourProcName"
cm.CommandTimeout = 120
With wb.Sheets("Data")
    .Activate
    .Range(.Cells(2, 1), .Cells(.Cells(.Rows.Count, 2).End(Excel.xlUp).Row + 1, .Cells(1, .Columns.Count).End(Excel.xlToLeft).Column)).ClearContents
End With
With rs
    .Open Source:=cm.Execute '<=====errors here===========
     wb.Sheets("Data").Cells(wb.Sheets("Data").Rows.Count, 1).End(Excel.xlUp)(2, 1).CopyFromRecordset rs
    .Close      'close connection
End With

【讨论】:

+1 感谢您提供此信息 - cm.CommandTimeout = 120 是解决方案。

以上是关于尝试运行短过程时查询超时已过期的主要内容,如果未能解决你的问题,请参考以下文章

关于查询报表总是"超时已过期"的问题解决

VBA中的超时过期错误?

在 SQL Server 2008 中执行视图时出现“超时已过期”错误

获取“结果已过期,如果需要,请重新运行查询。”在 Hive 中运行代码时出现错误消息

MS Access 给出 SQL Server 错误“登录超时已过期”,然后连接成功

EF Code First - 超时已过期。完成前经过了超时时间