根据documentation,Recordset.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>
答案 0 :(得分:0)
在第二种情况下,ADO不会创建静态游标。显然,OLE DB提供程序不支持带有CTE的服务器端静态游标,并将游标类型更改为adOpenForwardOnly
。仅向前游标总是返回-1作为RecordCount
。
发现此信息归功于Dan Guzman。