Использование On Error Resume Next
не является "magic bullet". Особенно нравится эта цитата из @ansgar-wiechers
«Вопреки распространенному мнению, это не волшебно делать ошибки уходят.»
On Error Resume Next
очень полезно, но необходимо использовать в правильном контексте. В то время как он активен, любая инструкция, вызывающая ошибку, обрабатывается молча, оператор, который поднял ошибку, пропускается, а встроенный Err
object заполняется данными об ошибках для захвата ошибок.
Как другие предложили первое, что вам нужно сделать, когда отладка этих проблем связана с комментарием On Error Resume Next
, тогда проблемы, которые я собираюсь выделить вам, возможно, нашли.
В приведенном выше примере есть несколько строк, которые, вероятно, поднимают ошибки и пропускаются, это;
Set data = con.Open(strQry)
Это заявление, как представляется, требуется выполнить запрос в strQry
но con.Open()
неправильный способ для этого, ADODB.Connection
уже открыта, не требует открытия снова. Вероятно, вы имели в виду (но это чистая догадка);
Set data = con.Execute(strQry)
Вы, кажется, не использовать data
после попытки запустить его, так что я бы в этой ситуации просто закомментируйте его сейчас.
Следующая:
objRecordset.Open strQuery, adoConnection, adOpenDynamic, adLockOptimistic
, который пытается открыть ADO.Recordset
с помощью strQuery
, который не кажется определен и ни один не adoConnection
вы, вероятно, имел в виду (опять догадок);
objRecordset.Open strQry, con, adOpenDynamic, adLockOptimistic
Если это утверждение вызывает ошибку и пропускается в заявлении
recordCount2 = objRecordset.Count
будет сама ошибка, потому что objRecordset
.State
будет установлен в adStateClosed
.
После этих предложений у вас должно быть что-то типа;
'On Error Resume Next
Dim recordCount2, constr
Set con = CreateObject("ADODB.Connection")
Set objRecordset = CreateObject("ADODB.Recordset")
constr = "Provider=SQLOLEDB;Integrated Security=SSPI;Persist Security Info=False;Data Source=servername\logon;Initial Catalog=database_name"
con.Open constr
strQry = "SELECT * FROM smd..table_name (nolock) WHERE CAST(LastRunDate AS DATE) = CAST(GETDATE() AS DATE) AND TableNameKey in ('value1', 'value2')"
'Set data = con.Open(strQry)
objRecordset.Open strQry, con, adOpenDynamic, adLockOptimistic
recordCount2 = objRecordset.Count
MsgBox "TT " & recordCount2 & "RR"
objRecordset.Close: Set objRecordset = Nothing
con.Close: Set con = Nothing
*** НИКОГДА *** не используйте глобальный 'On Error Resume Next', особенно если вы не выполняете обработку ошибок. Вопреки распространенному мнению, магические ошибки не исчезают. Это просто делает их невозможными для отладки. Также удалите строку 'Set data = con.Open (strQry)' (что это должно делать в любом случае?) И на самом деле проверьте [состояние подключения] (https://msdn.microsoft.com/en-us/library/ окна/настольные/ms675068% 2 = vs.85% 29.aspx). –