【问题标题】:ADODB Command.Execute TimeoutADODB 命令.执行超时
【发布时间】:2015-04-01 07:39:41
【问题描述】:

从 Excel vba 运行查询时出现超时错误

从 SQL Server Management Studio 查询需要

我在设置 Command 对象时是否做错了什么?我注意到 ADODB 似乎更慢,但从来没有这样的

查询连接了几个表并进行了一些其他计算,但是从 1.5 秒到 >2 分钟肯定意味着我错过了 vba 中的某些内容

这是我的 vba 连接字符串代码:

If svrCon Is Nothing Then
    Set svrCon = New ADODB.Connection
End If

If Not CheckServerConnectionState Then

    conStr = "Provider=SQLOLEDB;Data Source=ussantapps332;" & _
                    "Initial Catalog=Global_OEE_Data_Capture_Dev;User Id=sqluser;Password=*****;"

    ' Open the connection
    svrCon.ConnectionTimeout = 0
    svrCon.Open conStr

End If

这是我的 vba SELECT 代码:

Dim cmd As ADODB.Command
Dim par As ADODB.Parameter
Dim rst As ADODB.Recordset        

' Create command object
Set cmd = New ADODB.Command

cmd.CommandTimeout = 120
cmd.ActiveConnection = svrCon
cmd.CommandText = sql


' Create parameter object
If IsArrayInitialized(params) Then
    For x = 0 To UBound(params)
        If IsNull(params(x, 1)) Then
            Set par = cmd.CreateParameter(Type:=params(x, 0), Size:=1)
        Else
            Set par = cmd.CreateParameter(Type:=params(x, 0), Size:=Len(params(x, 1)) + 1)
        End If
        par.Value = params(x, 1)

        cmd.Parameters.Append par

        Set par = Nothing

        DoEvents
    Next
End If


' Open recordset object
On Error GoTo ExecuteError
Debug.Print Format(Now, "hh:mm:ss")
Set rst = cmd.Execute
Debug.Print Format(Now, "hh:mm:ss")
On Error GoTo 0

将sql字符串和参数传入函数,从另一个方法打开连接

查询是:

SELECT U.UnitsID, L.LineName, V.VSName, O.OperatorShift, O.LineLeader, O.CotyOps, O.TempOps, U.WorkOrder, U.ProductCode,
           S.ProdDesc, U.TimeLineStart, U.TimeLineEnd, U.UnitsProduced, U.ActLineSpeed, U.TgtLineSpeed, SUM(CASE WHEN C.DTIncludedInOEE = 0 THEN D.DowntimeLength ELSE 0 END),
           U.OfflineTaskID, R.Rate, S.LabHrsPerThou, S.PHeads, T.TgtOEE, T.TgtEff, T.TgtProd
      FROM dataUnits U
        LEFT JOIN dataOperatorNames O ON O.OperatorID = U.OperatorNameID
        INNER JOIN setupLines L ON U.LineID = L.LineID
        INNER JOIN setupValueStreams V on V.VSID = L.VSID
        INNER JOIN setupPUs P ON V.PUID = P.PUID
        LEFT JOIN dataDowntimes D ON U.UnitsID = D.UnitsID
        LEFT JOIN setupDowntimes sD ON D.DTID = sD.DTID
        LEFT JOIN setupDowntimeCats C ON sD.DTCatID = C.DTCatID
        LEFT JOIN (SELECT VSID, AVG(RateVal) Rate
                 FROM dataRates WHERE FYStart >= '2014-07-01' AND FYStart < '2015-07-01'
                        GROUP BY VSID) R ON R.VSID = L.VSID
        LEFT JOIN dataStandards S ON S.ProdCode = U.ProductCode
        LEFT JOIN (SELECT LineID, AVG(TgtOEE) TgtOEE, AVG(TgtEff) TgtEff, AVG(TgtProd) TgtProd
                    FROM dataTargets WHERE TgtMonth >= '2015-03-01' AND TgtMonth < '2015-04-01'
                            GROUP BY LineID) T ON L.LineID = T.LineID
      WHERE (S.SAPVersion = (SELECT MIN(SAPVersion) FROM dataStandards s2 WHERE s2.ProdCode = S.ProdCode)
            OR S.SAPVersion IS NULL)
      AND P.SiteID = 2 AND U.TimeLineStart >= '2015-03-05 23:00' AND U.TimeLineStart < '2015-03-31 23:00'
      GROUP BY U.UnitsID, L.LineName, V.VSName, O.OperatorShift, O.LineLeader, O.CotyOps, O.TempOps, U.WorkOrder, U.ProductCode, S.ProdDesc, U.TimeLineStart,
               U.TimeLineEnd, U.UnitsProduced, U.ActLineSpeed, U.TgtLineSpeed, U.OfflineTaskID, R.Rate, S.LabHrsPerThou, S.PHeads, T.TgtOEE, T.TgtEff, T.TgtProd
      ORDER BY U.TimeLineStart ASC

【问题讨论】:

  • 我的理解是否正确,从 SQL Server Management Studio 和 Excel VBA 运行的查询具有相同的输入参数并针对同一个数据库运行?
  • 是的,查询是一样的,我使用了相同的参数和数据库是一样的
  • 您是否尝试在 Excel VBA 中一一运行此查询两次。我想确认执行它总是需要 2 分钟,而不仅仅是第一次。
  • 这需要超过 2 分钟,我已将其设置为超时,并且每次都会出错。我将超时时间更改为零以查看需要多长时间,我将运行它几次并回复您
  • 所以 3 次运行 - 第一次用时 2 分钟 31,第二次用时 2 分钟 27,第三次用时 2 分钟 35

标签: excel sql-server-2012 adodb vba


【解决方案1】:

聊天中的讨论表明:

  • 该问题仅在连接到远程数据库时出现。
  • 使用旧的 SQLOLEDB 提供程序。

我建议给一个更新的提供程序 SQLNCLI 一个机会,它在与 MSSQL 通信时应该更有效。修改连接字符串后,执行时间从 2 分钟减少到 3 秒。

【讨论】:

  • 所以最后我的连接字符串看起来像:conStr = "Provider=SQLNCLI11;Data Source= (......).
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
  • 1970-01-01
  • 2021-10-07
相关资源
最近更新 更多