源程序如下:
public function exesql(byval sql as string) as adodb.recordset
  sql=trim(sql)
  set conn=new adodb.connection
  set rst=new adodb.recordset
  conn.connectionstring="dsn=ks;uid=sa;pwd=;"
  conn.open
  set rst.activeconnection=conn
  rst.locktype=adlockoptimistic
  rst.cursortype=adopenkeyset
  rwt.open sql
  set exesql=rst
  set rst=nothing
  set conn=nothing
end functionprivate sub command1_click()
  dim mrc as adodb.recordset
  txtsql="select * from oper where 用户名='"& trim(text1(0).text)&"'"&"and 口令=‘“&trim(text1(1).text)+ "'"
  set mrc=exesql(txtsql)
  if mrc.recordcount=0 then  为什么recordcount=-1??????
    ....
    ...
  else
    .....
   .....
  end if
end sub
我现在遇到的问题是mrc.recordcount始终等于-1,就算我在数据库中手工加入一条记录,在Text(0),text(1)中输入符合的记录后,执行command1,mrc.recordcount还是等于-1,请问那位高手给说说是什么原因?

解决方案 »

  1.   

    注意你的结果集游标类型
    你使用
    rs.Open txtsql, conn, adOpenKeyset
    应该就没有问题了
      

  2.   

    你的txtsql语句中符号的全半角是不是没写好!
    "mrc.recordcount始终等于-1"说明语句没有执行成功!
    你把txtsql语句改为下面的试试:(注意:别以为和你上面的一样,差别在全半角上) txtsql="select * from oper where 用户名='"& trim(text1(0).text)&"' and 口令='" & trim(text1(1).text) & "'"   
      

  3.   

    free_eyes(自由之眼) 说得对,如果语句没有执行成功,向楼上说的那样,有全半角问题,VB会报错的。mrc.recordcount我总觉得不好用,自己做个函数。Public Function Myrecordcount(rs As ADODB.Recordset, sql As String) As Long
    Dim rsmy As New ADODB.Recordset
    rsmy.Open "select count(*) as rc " & Mid(sql, InStr(sql, "from")), rs.ActiveConnection 
    Myrecordcount = rsmy("rc")
    rsmy.Close
    End Function再没有问题。
      

  4.   

    增加一条CursorLocation设置语句:
    .....
    dim mrc as adodb.recordset
    mrc.CursorLocation = adUseClient 
    ....
      

  5.   

    改为这样就没有问题了
    private sub command1_click()
      dim mrc as adodb.recordset
      txtsql="select * from oper where 用户名='"& trim(text1(0).text)&"'"&"and 口令=‘“&trim(text1(1).text)+ "'"
      mrc.CursorLocation = adUseClient
      set mrc=exesql(txtsql)
      if mrc.recordcount=0 then 
        ....
        ...
      else
        .....
       .....
      end if
    end sub
      

  6.   

    使用静态游标除了静态游标外其它游标不能返回准确的记录数。mrc.CursorLocation = adUseClient。设置或返回游标引擎的位置。设置成客户端游标。也是对的。
      

  7.   

    rst.locktype=adlockoptimistic
      rst.cursortype=adopenkeyset
    该为
     rst.locktype=adLockReadOnly
      rst.cursortype=adopenkeyset
    既可以了^_^
      

  8.   

    同意此情可待的说法。我也碰到过和楼主一样的问题,就时在昨晚弄明白了,就是CursorLocation = adUseClient,就可以返回了记录数了,而CursorLocation = aduserserver,就返回-1
      

  9.   

    set rst=nothing好像有问题,这里释放了,就没法传递了,
      

  10.   

    增加一条CursorLocation设置语句:
    .....
    dim mrc as adodb.recordset
    mrc.CursorLocation = adUseClient
      

  11.   

    使用静态游标,
    再加上一句,mrc.movelast
      

  12.   

    感谢各位高手相助,问题解决了,我的这段源程序出自一本名为《Visual Basic数据库系统设计与开发》一书,我感觉现在的编程书的"Bug"(严格的说,应该是书中没说明清楚)可真不不少,我买的几本书都是这样,有的甚至源程序根本不能运行。这本书还算可以的了。顺便说说用的是
      set rst.activeconnection=conn
      rst.locktype=adlockoptimistic
      rst.cursortype=adopenkeyset
     mrc.CursorLocation = adUseClient 
      rwt.open sql
    我看了csdn上的不少朋友都遇到了这个问题,希望能够给以参考
    再次感谢