代码之家  ›  专栏  ›  技术社区  ›  Brandon Michael Hunter

ado.recordcount等于-1问题

  •  7
  • Brandon Michael Hunter  · 技术社区  · 16 年前

    当我试图访问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 回复  |  直到 16 年前
        1
  •  3
  •   Gabriele Petrioli    16 年前

    对于分页,可以使用 recordset.PageSize recordset.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 要知道返回的页数..

        2
  •  4
  •   Drew    16 年前

    默认的仅向前游标不支持记录计数。 必须向open命令添加额外参数

    rs.open sql,连接,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()”,这是不使用存储过程的最快方式)

        3
  •  3
  •   Mitch Wheat    16 年前

    请注意:除非移到记录集的末尾,否则无法保证记录计数已填充。使用 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\u picosearchlisting”

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

    获取记录计数的另一种方法是执行:

    rs.MoveLast
    rs.MoveFirst
    

    然后检查recordcount,即使如此,我似乎还记得有些游标类型是不能保证的(但在这方面内存是模糊的)。

    也注意 :除非您确实需要,否则不要使用moveLast/moveFirst:使用大型记录集或跨网络绘制的记录集会很慢。而是使用count(*)技术。