1
按照documentation,Recordset.RecordCount
應該使用靜態記錄時(重點煤礦)返回行的實際數量:靜態ADO記錄集返回的RecordCount -1使用公共表表達式時
RecordCount屬性將對於只進遊標返回-1; 靜態或鍵集遊標的實際計數;以及-1或動態遊標的實際計數,具體取決於數據源。
Const sql1 = "SELECT myField FROM myTable" Const sql2 = "WITH mycte AS (SELECT myField FROM myTable) SELECT myField FROM myTable" Dim cn As New ADODB.Connection cn.Open "Provider=SQLOLEDB;Server=myServer;Initial Catalog=myDatabase;Integrated Security=SSPI" Dim rs As New ADODB.Recordset rs.CursorLocation = adUseServer rs.Open sql1, cn, adOpenStatic, adLockReadOnly, adCmdText Debug.Print rs.RecordCount ' Yields 156 ' rs.Close rs.Open sql2, cn, adOpenStatic, adLockReadOnly, adCmdText Debug.Print rs.RecordCount ' Yields -1; should be 156 ' rs.Close cn.Close
這是一個已知的問題:
但是,使用SQLOLEDB
供應商,包括公共表表達式的SQL語句時,這顯然是不真實的?
我知道我可以通過使用客戶端而不是(默認)服務器端遊標來解決此問題,但我寧願不這樣做以避免在我們的舊代碼中引入迴歸。
在'sql2'中,你有意忽略(不使用)'mycte'嗎? – stakx 2014-10-10 10:43:19
@stakx:是的,因爲訪問'mycte'不需要重現問題(只需聲明就足夠了),我想提供一個最簡單的例子。 – Heinzi 2014-10-10 10:46:12