使用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
***從不*** ***使用全局'在錯誤恢復下一個',特別是如果你沒有做任何類型的錯誤處理。與流行的看法相反,它不會讓魔法失誤消失。這隻會讓他們無法進行調試。還要刪除'Set data = con.Open(strQry)'(那應該做什麼?)的行,然後實際檢查[連接狀態](https://msdn.microsoft.com/en-us/library/窗戶/桌面/ ms675068%28V = vs.85%29.aspx)。 –