日期:2013-03-02  浏览次数:20812 次

    现象

  当在服务器端请求RecordCoun时会返回-1。这是因为ActiveX Data Objects (ADO) 2.0中的CursorType是adOpenForwardonly或者adOpenDynamic。

  如果是ADO 1.5,只发生在cursortype是adOpenForwardonly的时候。如果使用OLEDB provider for JET和SQL Server产生的结果可能不同,这依赖于数据库的提供者。 

  提供者可能不支持某些CursorTypes。当你选择的CursorType不被支持时,提供者将选择最接近于你所请求的CursorType。请参考你的提供者的文档。此外,请注意不是所有的LockType和CursorType的组合都可以同时工作。改变LockType将强制改变CursorType。请确定使用调试来检查CursorType的值。 

  原因 
     
  在动态的游标中纪录号可能改变。Forwardonly的游标无法返回RecordCount。

  解决办法 

  使用adOpenKeyset(=1)或者adOpenStatic(=3)作为服务器端游标或者客户端游标。客户端只使用adOpenStatic作为CursorTypes,而不管你选择什么样的CursorType。 
     
  状态
     
  这个形式是设计决定的。

===============================================================================

  链接文档帮助理解解决

  有关rs.open sql,1,1中“1”和另外一个“1”的解释

  rs.open sql,1,1也可以写成


rs.CursorType  =  1
rs.LockType  =  1
rs.open  sql

  其中CursorType代表从一个表或者一个SQL查询结果返回的记录。

  这个参数有四个值分别是:

  adOpenForwardOnly(=0)

  表示只允许在记录集内的记录间往前移动。这个是缺省值。(只读,且当前数据记录只能向下移动)

  adOpenKeyset(=1)

  反映由其它用户所做的对记录的改变或者删除动作,但并不反映由其它用户做作的添加新记录的动作。(只读,当前数据记录可自由移动)

  adOpenDynamic(=2) 

  反映由其它用户所做的对记录的改变或者删除动作,包括添加的新记录。(可读写,当前数据记录可自由移动)

  adOpenStatic(=3)

  不反映其它用户对记录所做的修改,添加,删除动作。(可读写,当前数据记录可自由移动,可看到新增记录)

  lockType 表示当打开记录集时,数据提供者用于锁定数据库的类型:

  adLockReadOnly(=1)

  数据不能改变,缺省锁定类型,记录集是只读的,不能修改记录

  adLockPessimistic(=2)

  悲观锁定,当修改记录时,数据提供者将尝试锁定记录以确保成功地编辑记录。只要编辑一开始,则立即锁住记录。(数据提供者在开始编辑数据的时候锁定记录)

  adLockOptimistic(=3)

  乐观锁定 ,直到用Update方法提交更新记录时才锁定记录。(仅当调用update方法时,数据提供者锁定记录)

  adLockBatchOptimistic(=4)

  批量乐观锁定,允许修改多个记录,只有调用UpdateBatch方法后才锁定记录。(用于批处理修改)