使用公用表表达式时,静态ADO记录集返回RecordCount -1

时间:2014-10-10 10:37:52

标签: sql-server vba oledb ado

根据documentationRecordset.RecordCount应该在使用静态记录集时重复实际行数(强调我的):

  

对于仅向前游标,RecordCount属性将返回-1; 静态或键集游标的实际计数;并且-1或动态游标的实际计数,具体取决于数据源。

但是,当使用SQLOLEDB提供程序和包含公用表表达式的SQL语句时,这显然是不真实的:

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

这是一个已知问题吗?

我知道我可以通过使用客户端而不是(默认)服务器端游标解决此问题,但我不应该这样做以避免在我们的遗留代码中引入回归。 / p>

1 个答案:

答案 0 :(得分:0)

在第二种情况下,ADO不会创建静态游标。显然,OLE DB提供程序不支持带有CTE的服务器端静态游标,并将游标类型更改为adOpenForwardOnly。仅向前游标总是返回-1作为RecordCount

发现此信息归功于Dan Guzman