2016-09-15 104 views
0

我有以下內容,但它不會將查詢中的記錄數記入MsgBox。只有RR和TT。顯示記錄數

On Error Resume Next 
Dim recordCount2 

Set con = CreateObject("ADODB.Connection") 

Set objRecordset = CreateObject("ADODB.Recordset") 
con.ConnectionString = "Provider=SQLOLEDB;Integrated Security=SSPI;Persist Security Info=False;Data Source=servername\logon;Initial Catalog=database_name" 
con.Open 
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 strQuery, adoConnection, adOpenDynamic, adLockOptimistic 

recordCount2 = objRecordset.Count 
MsgBox "TT " & recordCount2 & "RR" 

objRS.Close: Set objRS = Nothing 
con.Close: Set con = Nothing 
+2

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

回答

2

我的猜測是有是一個的出現正在由On error resume next隱藏的錯誤,並且recordCount2 = objRecordset.Count沒有真正獲得成功。爲什麼你有On error resume next呢?刪除該行或將其註釋掉,並且您的問題應該變得明顯。

+0

完全同意,可能的原因是這條線是沒有意義的 - 'objRecordset.Open strQuery,adoConnection,adOpenDynamic,adLockOptimistic','strQuery'和'adoConnection'都沒有在代碼中定義。 – Lankymart

1

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

嗨。我嘗試了前面的建議。但現在我得到一個錯誤SQL Server不存在或訪問被拒絕。我確定我的服務器名稱存在並拼寫正確。什麼會導致這個錯誤?它可能是工作中的安全設置嗎? – user2811136

+0

@ user2811136你現在得到的事實是進步,你現在只需要確保你使用的是正確的連接字符串。目前它期待着[可信連接到SQL Server](http://www.connectionstrings.com/microsoft-ole-db-provider-for-sql-server-sqloledb/trusted-connection/),這可能不是在這種情況下工作。發佈更多關於您正在運行的SQL Server版本的信息,我們可能會提供幫助。 – Lankymart

0

通過只寫出那些絕對確定的行/語句,儘量避免編寫代碼。如果您還沒有看到一些解釋爲什麼要解決問題的說明文檔,請將x關閉。

之前編寫代碼,閱讀文檔:RecordCount property

... Recordset對象的遊標類型會影響記錄的數量 是否能夠確定。對於只向前遊標,RecordCount屬性將返回-1 ;遊標的實際計數爲靜態或鍵集 ;和-1或動態光標的實際計數, 取決於數據源。 ...

所以,你的計劃是:

  1. 打開一個連接
  2. 獲取一個記錄
  3. 訪問其.RecordCount

的VBScript中的一般框架包括:

Option Explicit 

它確實有不是包含邪惡的全球OERN。

數據庫工作的具體框架包含:

Dim oCn : Set oCN = CreateObject("ADODB.Connection") 
oCn.Open "DSN=???" 
... 
oCn.Close 

not包含分心Set x = Nothing尾巴。

對於生產腳本或測試代碼的連接問題,您需要編寫長/複雜/定製的連接字符串;對於小型特定數據庫特性/問題/意外的實驗性代碼(一次性所有困惑在一起的GUI支持)ODBC/DSN連接更加高效且不易出錯。

的記錄應與年開業遊標類型玩法:

oRs.Open "SELECT AddressId FROM Person.Address", oCn, adOpenDynamic 

可選的鎖定離開(直到你有書面或實驗證據表明,鎖類型影響.RecordCount)。

如果您嘗試運行

Option Explicit 

Dim oCn : Set oCN = CreateObject("ADODB.Connection") 
oCn.Open "DSN=AdvWork" 
Dim oRs : Set oRS = CreateObject("ADODB.Recordset") 
oRs.Open "SELECT AddressId FROM Person.Address", oCn, adOpenDynamic 
WScript.Echo ".RecordCount:", oRs.RecordCount 
oCn.Close 

你會被告知:變量未定義: 'adOpenDynamic'。進一步的(再)閱讀能力,你的代碼有點看起來像

Option Explicit 
Const adOpenKeyset = 1 

Dim oCn : Set oCN = CreateObject("ADODB.Connection") 
oCn.Open "DSN=AdvWork" 
Dim oRs : Set oRS = CreateObject("ADODB.Recordset") 
oRs.Open "SELECT AddressId FROM Person.Address", oCn, adOpenKeyset 
WScript.Echo ".RecordCount:", oRs.RecordCount 
oCn.Close 

輸出:

cscript 39519953.vbs 
.RecordCount: 19614 

和世界是一個(點點)更好的地方。

+0

嗨。我有一個像testthis01這樣的密碼的用戶!但我認爲!正在拋棄它。我收到錯誤信息,說「登錄失敗...」 – user2811136

+0

如果在正確的上下文中使用「On Error Resume Next」並且沒有什麼壞處,並且在您所要做的只是註釋該行時調試它不是問題。推薦DSN的使用情況非常好,但不是每個人都可以直接訪問他們的網絡服務器*(共享主機,通過保護網絡管理員等)*,更不用說把DSN放在32/64上的正確位置位系統。同時鼓勵人們不要發佈對象引用只是愚蠢的沒有什麼分散他們的好處超出了不便*(如果你甚至可以稱之爲)* – Lankymart