当前位置:编程学习 > VB >>

一段代码,为什么rs.recordcount总是-1呢?

本来想在list里面把查询到的结果显示出来,结果rs.recordcount总是为-1,但是把if去掉后确能正确显示结果,为什么呢???
Private Sub Command1_Click()
  '''''''''''''''''''''
  Dim cn As ADODB.Connection
  Dim rs As ADODB.Recordset
  Dim sql As String
  Set cn = New ADODB.Connection
  Set rs = New ADODB.Recordset
  sql = "select * from ddd where usertype='2'"
  cn.ConnectionString = "provider=Microsoft.Jet.oledb.4.0;data source=ddd.mdb"
  cn.Open
  Set rs = cn.Execute(sql)
  
  Debug.Print rs.RecordCount
  If rs.RecordCount > 0 Then
        rs.MoveFirst
        Do Until rs.EOF
            List1.AddItem rs("username")
            Debug.Print rs("username")
            rs.MoveNext
        Loop
  End If  
  
  rs.Close
  cn.Close
  Debug.Print "EEEEEEEEEE"
End Sub --------------------编程问答-------------------- 看语句没瞧出问题,先用 msgbox rs.RecordCount显示一下,如果在IF前就是-1了那再找问题
--------------------编程问答-------------------- 没遇过这样的问题,我一般都会在
Set   rs   =   New   ADODB.Recordset 
下加入下面的语句试试:
rs.CursorLocation = adUseClient
--------------------编程问答-------------------- agree to LS --------------------编程问答-------------------- 不行~~~ --------------------编程问答-------------------- 如果查询有数据返回,可能跟游标有关系。
你可以试试这样

rs.MoveLast
rs.MoveFirst

Debug.Print rs.RecordCount
--------------------编程问答-------------------- 测试下 
If   rs.RecordCount   >   0   Then
改成
==>
If   not rs.eof  Then

有没有debug窗口输出 --------------------编程问答-------------------- 这是官方说明,不知道对应到我的代码是错在哪里呢????
=================================================
使用 RecordCount 属性可确定 Recordset 对象中记录的数目。ADO 无法确定记录数时,或者如果提供者或游标类型不支持 RecordCount,则该属性返回 –1。读已关闭的 Recordset 上的 RecordCount 属性将产生错误。

如果 Recordset 对象支持近似定位或书签(即 Supports (adApproxPosition) 或 Supports (adBookmark) 各自返回 True),不管是否完全填充该值,该值将为 Recordset 中记录的精确数目。如果 Recordset 对象不支持近似定位,该属性可能由于必须对所有记录进行检索和计数以返回精确 RecordCount 值而严重消耗资源。

Recordset 对象的游标类型会影响是否能够确定记录的数目。对仅向前游标,RecordCount 属性将返回 -1,对静态或键集游标返回实际计数,对动态游标取决于数据源返回 -1 或实际计数。
================================================== --------------------编程问答-------------------- rs.CursorLocation = adUseClient
rs.MoveLast 
rs.MoveFirst

都需要。后两句强制遍历,取得记录数。

如果 sql = "select * from ddd where usertype='2' order by username" 则可以省掉后两句,因为已经发生遍历。
--------------------编程问答-------------------- 再这样呢?
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient
rs.CursorType = adOpenStatic
rs.LockType = adLockOptimistic --------------------编程问答-------------------- 以前碰到多这个问题。

Set rs.ActiveConnection = cn
rs.LockType = adLockOptimistic
rs.CursorType = adOpenKeyset
rs.Open sql

Open方式得到的记录集个数就是对的,Execute得到的个数就不对。
不要文我为什么,MS动东西就是这么垃圾! --------------------编程问答-------------------- 没有注意看,改这里:

    'Set rs = cn.Execute(sql)
    rs.Open sql, cn
--------------------编程问答-------------------- Set rs = cn.Execute(sql) 只能得到数据行集合,很多属性和功能不支持。 --------------------编程问答-------------------- 那recordset用哪种形式打开能得到完全的功能(属性、方法)的支持呢? --------------------编程问答-------------------- 不是MS的东西垃圾,好好看看ADO相关文档吧
execute方法返回的记录集是只读向前的,不返回recordcount属性
要返回recordcount属性,必须在客户端游标(rs.CursorLocation=adUseClient)下用open方法返回记录集
服务器游标(默认)下,用open方法返回记录集同样不返回recordcount属性
......

--------------------编程问答-------------------- execute相对于open而言是高效的返回记录集的方法,如果你要对记录集进行写操作,就要用open方法,要返回recordvount就要对记录集设置客户端游标 --------------------编程问答-------------------- 谢谢^_^~~~总算调试完
总结一下:主要问题出在两个方面,一个是打开的方式,不能用excute要用open,然后是设置cusor两个属性rs.CursorLocation   =   adUseClient 
rs.CursorType   =   adOpenStatic ,随便一个设置了都可以获取到count的值了。。。

谢谢各位了 --------------------编程问答-------------------- 学习...
补充:VB ,  数据库(包含打印,安装,报表)
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,