ADO Recordset对象的RecordCount属性总是-1? 收藏
最近在用asp做网页后台时,遇到了一个烦人的问题,RecordSet对象的RecordCount和PageCount均为-1.不能直接获取RecordCount属性,我就想了其他的笨办法代替,比如,利用了SQL的集函数select Count(*) as count from table,这样count中就存储了RecordSet的属性值;或者,利用一个变量存储,在游标从头到尾的搜索过程中,这个变量逐次加一,最终就得到了该属性: <% dim i i=0
set rs=conn.Open \do while not rs.EOF i=i+1 rs.MoveNext Loop %>
可是,接下来要用到PageCount属性来实现分页(AbsolutePage:指定当前页;PageCount:返回记录集中的逻辑页数;PageSize:指定一个逻辑页中的记录个数,缺省值是10.)这种方法行不通了,没办法,就开始到处搜集信息:
首先让我们来看看怎么样获得记录集RecordSet,有以下几种: <%
set conn = Server.CreateObject(\set rs = conn.Open(sqlstring) %>
另外一种方式:
<% set conn = Server.CreateObject(\set cmd = Server.CreateObject(\cmd.ActiveConnect = conn
cmd.StringText = \set rs = cmd.Open conn %> 而另外一种办法就是:
<%
set rs = Server.CreateObject(\rs.open sql,conn,打开方式,锁类型 %> 参数一表示游标类型,如下设置: 参数1 意 义 0 只读, 数据只能向下移动
1 可读写,数据可以自由移动,多用户下别人不能看到新增数据(除非重启动) 2 可读写,数据可以自由移动,多用户下别人可以看到新增数据 3 只读 , 数据可以自由移动
参数2表示锁定类型,如下: 参数2 意 义 1 默认值, 只读 2 悲观锁定 3 乐观锁定 4 批次乐观锁定
也就是说第一个参数为1或2的时候,才能有recordcount
所以也可以用recordset.open打开数据源: rs.CursorLocation = adUseClient rs.CursorType = adOpenStatic rs.open sqlstring,conn
在我的程序中,改为第二种打开方式就可以正确访问RecordSet的那些属性了.具体就是: rs.Open sqlstring,conn,1,3
那么CursorLocation和CursorType到底是什么东西,能产生这么大的影响? (1)CursorLocation:
设置或返回游标引擎的位置, 可设置为以下某个常量的长整型值:
adUseNone: 没有使用游标服务.(该常量已过时并且只为了向后兼容才出现) adUseClient:
使用由本地游标库提供的客户端游标。本地游标引擎通常允许使用的许多功能可能是驱动程序提
供的游标无法使用的,因此使用该设置对于那些将要启用的功能是有好处的。adUseClientBatch 与 adUseClient 同义,也支持向后兼容性。
到这里大家应该明白为什么我们的游标会出问题及解决办法了. adUseServer:
默认值。使用数据提供者或驱动程序提供的游标。这些游标有时非常灵活,对于其他用户对数据源所作的更改具有额外的敏感性。但是,Microsoft Client Cursor Provider(如已断开关联的记录集)的某些功能无法由服务器端游标模拟,通过该设置将无法使用这些功能。
注:当用于客户端(ADOR)RecordSet或Connection对象时,只能将CursorLocation属性设置为adUseClient. (2)CursorType:
指示在RecordSet对象中使用的游标类型,设置或返回以下某个CursorTypeEnum值: adOpenForwardOnly(=0):
仅向前游标,默认值.与静态游标相同,但只能在记录中向前滚动.当需要在记录集中单向移动时,可用于提高性能. adOpenKeyset(=1):
键集游标。尽管从您的记录集不能访问其他用户删除的记录,但除无法查看其他用户添加的记录外,键集游标与动态游标相似。仍然可以看见其他用户更改的数据。 adOpenDynamic(=2):
动态游标。可以看见其他用户所作的添加、更改和删除。允许在记录集中进行所有类型的移动,但不包括提供者不支持的书签操作。 adOpenStatic(=3):
静态游标。可以用来查找数据或生成报告的记录集合的静态副本。另外,对其他用户所作的添加、更改或删除不可见。
注:如果将 CursorLocation 属性设置为 adUseClient,则只支持 adOpenStatic 的设置。如果设置了不支持的值,不会导致错误,并将使用最接近支持的 CursorType。
当用于客户端 (ADOR) Recordset 对象时,只能将 CursorType 属性设置为 adOpenStatic。
另外在查资料的过程中,发现网上也有好多人在问这个问题,看他们是怎么解决的,顺便汇总一下各方面的资料:
打开方式有问题吧,后两个参数设为3,1试试,想更改用3,3,如果既要记录数又要允许修改就试1,3
rs.CursorLocation = adUseClient '设为adUseClient
rs.Open \语句\ '或者游标类型为adOpenStatic 将返回记录总数
当CursorType=1时,rs.RecordCount是不可用的,将其设为3即可。
你只要将RecordSet的游标类型设置为客户端游标类型就行了: 设置cursorlocation=adUseServer
这个问题我碰到过,打开参数只有在为adopenstastic的情况下recordcont属性才能正确显示数据集中的记录值Recordset对象的游标类型会影响是否能够确定记录的数目。对仅向前游标,RecordCount性将返回-1,对静态或键集游标返回实际计数,对动态游标取决于数据源,返回-1或实际计数。
RS.OPEN SQL,CONN,A,B A为游标类型,B为锁类型
A: adOpenForwardOnly(=0) 只读,且当前数据记录只能向下移动 adOpenKeySet(=1) 只读,当前数据记录可自由移动 adOpenDynamic(=2) 可读写,当前数据记录可自由移动
adOpenStatic(=3) 可读写,当前数据记录可自由移动,可看到新增记录 B: adLockReadOnly(=1) 缺省锁定类型,记录集是只读的,不能修改记录
adLockPessimistic(=2) 悲观锁定,当修改记录时,数据提供者将尝试锁定记录以确保成功地编辑记录。只要编辑一开始,则立即锁住记录。
adLockOptimistic(=3) 乐观锁定,直到用Update方法提交更新记录时才锁定记录。 adLockBatchOptimistic(=4) 批量乐观锁定,允许修改多个记录,只有调用UpdateBatch方法后才锁定记录。 当不需要改动任何记录时,应该使用只读的记录集,这样提供者不用做任何检测。对于一般的使用,乐观的锁定可能是最好的选择,因为记录只被锁定一小段时间,数据在这段时间被更新。这减少了资源的使用。 引用: