2013-11-03 87 views
6

Oto mój ciąg połączenia:Limit czasu zapytania upłynął podczas próby uruchomienia krótką procedurę

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;" 

A oto prosty kod:

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 
... 
... 

w punkcie oznaczonym powyżej pojawia się następujący błąd:

enter image description here

nie rozumiem - z procedur e trwa 55 sekund, aby uruchomić i przez cały czas vba ustawiłem limity czasu na 0 ... Myślałem, że to zmusiło ich do wygaśnięcia , a nie?

Odpowiedz

14

Czy próbowałeś ustawiania czasu się wyraźnie na komendzie?

cm.CommandTimeout = 0 

Zamiast ustawić go w połączeniu. Wydaje mi się, że limit czasu połączenia dotyczy tego, jak długo można próbować nawiązać połączenie, zanim odrzuci, a czas oczekiwania polecenia to czas, jaki ma wykonać polecenie.

+1

+1 dzięki za te informacje - 'cm.CommandTimeout = 120' jest rozwiązaniem. – whytheq

2

Czy masz pojęcie, jak długo powinno potrwać wykonanie zapytania? Czy może być inny problem niż limit czasu?

Należy spróbować ustawić limit czasu na obiekt polecenia jak poniżej:

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

+1 dzięki za te informacje - 'cm.CommandTimeout = 120' jest rozwiązaniem. – whytheq