ADO.RecordCount等于-1问题

时间:2010-01-08 01:35:01

标签: asp-classic ado

当我尝试访问RecordCount属性时,我总是得到-1的返回值。以下是我的示例代码。

Set oConn = Server.CreateObject ("ADODB.Connection")
oConn.Open Application("strConnectstring")
Set rs = Server.CreateObject ("ADODB.Recordset")
rs.ActiveConnection = oConn
SQL = "Publications_PicoSearchListing"
set rs = oConn.execute(SQL)

我不确定我是在做forwardCursor还是动态游标,或者提供者是否支持RecordCount属性。如何检查提供程序是否支持RecordCount属性,或者我是否使用forwardCursor或动态游标。

任何帮助都将不胜感激。

谢谢

3 个答案:

答案 0 :(得分:4)

默认的只进游标不支持Recordcount。 你必须在open命令中添加额外的参数

rs.open sql,conn,1,1

这应该让你有权访问rs.recordcount。

但最好使用Recordset.GetRows()+ Recordset.Move()方法进行分页。

http://databases.aspfaq.com/database/how-do-i-page-through-a-recordset.html (向下滚动到粗体“Recordset.GetRows()+ Recordset.Move()”这是不使用存储过程的最快方法)

答案 1 :(得分:3)

请注意:除非您移动到记录集的末尾,否则无法保证RecordCount已被填充。使用While Not rs.EOF迭代记录集中每一行的标准模式。在我写过的所有VBA代码中,我从未依赖于检查rs.RecordCount

您可以设置它,而不是检查光标类型。例如:

Set conn=Server.CreateObject("ADODB.Connection")
conn.Provider="Microsoft.Jet.OLEDB.4.0"
conn.Open(Server.Mappath("northwind.mdb"))
set rs = Server.CreateObject("ADODB.recordset")
sql="SELECT * FROM Customers"

rs.CursorLocation = adUseClient
rs.CursorType = adOpenStatic
rs.LockType = adLockBatchOptimistic

rs.Open sql, conn

如果您想要的只是计数,为什么不发出“SELECT Count(*)From Publications_PicoSearchListing”

感兴趣?:Understanding ADO's Default Cursor Type

获取RecordCount的另一种方法是执行:

rs.MoveLast
rs.MoveFirst

然后检查RecordCount,即便如此我似乎还记得一些游标类型不能保证(但内存模糊不清)。

另请注意:除非您确实需要,否则不要使用MoveLast / MoveFirst:对于大型记录集或通过网络绘制的记录集,这将会很慢。而是使用Count(*)技术。

答案 2 :(得分:3)

对于传呼,您可以使用recordset.PageSizerecordset.AbsolutePage这样的

Set rs = Server.CreateObject("ADODB.Recordset")
' make recordset use adUSEclient ( client side cursor)'
rs.CursorLocation = 3
' make recordset use the adOpenStatic cursor ( scrollable )'
rs.CursorType = 3
rs.PageSize = RecordsPerPage

rs.Open sql, conn
' go to selected page'
if not rs.EOF and not rs.BOF then
    rs.AbsolutePage = page_you_want_to_go
end if

然后您可以访问recordset.PageCount以了解返回的页数..