2015-04-01 2 views
0

Я вижу ошибку таймаута при выполнении запроса из VBA ExcelADODB Command.Execute Timeout

Запрос занимает < 2 секунды из SQL Server Management Studio, но с VBA тайм-аут происходит через 2 минуты ни с чем вернулись

Есть ли что-то, что я не делаю правильно, настраивая объект 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 ВЫБРАТЬ:

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 
+0

Насколько я понимаю, что запросы, выполняемые с помощью SQL Server Management Studio и из Excel VBA, имеют одинаковые параметры ввода и запускаются в одной базе данных? –

+0

Да, тот же вопрос, я использовал те же параметры, и база данных одинакова. – iabbott

+0

Вы пытались запустить этот запрос в Excel VBA два раза по одному. Я хотел бы подтвердить, что для его выполнения требуется всего 2 минуты, и не только в первый раз. –

ответ

1

Обсуждение чата показал, что:

  • Проблема возникает только при подключении к удаленная база данных.
  • Используется старый поставщик SQLOLEDB.

Я предложил дать возможность более новому провайдеру SQLNCLI, который должен быть более эффективным при общении с MSSQL. При изменении строки подключения время выполнения сократилось с 2 минут до 3 секунд.

+0

Итак, моя строка подключения выглядит следующим образом: 'conStr =" Provider = SQLNCLI11; Источник данных = (......). ' – iabbott