2014-10-10 67 views
1

按照documentationRecordset.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語句時,這顯然是不真實的?

我知道我可以通過使用客戶端而不是(默認)服務器端遊標來解決此問題,但我寧願不這樣做以避免在我們的舊代碼中引入迴歸。

+0

在'sql2'中,你有意忽略(不使用)'mycte'嗎? – stakx 2014-10-10 10:43:19

+0

@stakx:是的,因爲訪問'mycte'不需要重現問題(只需聲明就足夠了),我想提供一個最簡單的例子。 – Heinzi 2014-10-10 10:46:12

回答

0

在第二種情況下,ADO不創建靜態遊標。顯然,OLE DB提供程序不支持帶CTE的服務器端靜態遊標,並將光標類型更改爲adOpenForwardOnly。僅前向遊標始終返回-1作爲RecordCount

發現此問題的積分爲Dan Guzman