我是初次学习使用存储过程序,在网上找个实例照写的,这个程序是有两个变量带到存储过程序,输出结果集,可是在执行到MsgBox rs4.RecordCount时,rs4.RecordCount的值为-1 ,是不是没的查询结果的意思,不知道是不是我的参数有问题,请高手帮我看看,我也多学习学习呀存储过程
**********************
CREATE procedure select_users 
 @regname char(20), 
 @regname1 char(20), 
 @numrows char(20)  OutPut
as 
 SELECT RelayBarCode,CheckerBarCode,OperatorBarCode,OptDate,ErrBarCode,YH002,OPTE,ds,jdqcode,jdqname
 FROM CX
 left join XTCPDA.dbo.jdqdzb ON TH=jdqcode 
 WHERE OptDate  between  @regname   and @regname1
 ORDER BY OptDate,RelayBarCode
GO
VB中语句
********************************************
 Private Sub Command3_Click()
    
    Set rs4 = New ADODB.Recordset    Set cmd = New ADODB.Command    cmd.ActiveConnection = ADOCN 'mConn  指定连接的数据库    cmd.CommandText = "select_users"   '指定调用的存储过程名称    cmd.CommandType = adCmdStoredProc    '将 CommandText 作为存储过程名进行计算
    
    Set param = cmd.CreateParameter("RetVal", adInteger, adParamReturnValue, 4)    cmd.Parameters.Append param    Set param = cmd.CreateParameter("regname", adChar, adParamInput, 20, Trim(Text4.Text))
    cmd.Parameters.Append param
    Set param = cmd.CreateParameter("regname1", adChar, adParamInput, 20, Trim(Text5.Text))
    cmd.Parameters.Append param    Set param = cmd.CreateParameter("numrows", adInteger, adParamOutput)    cmd.Parameters.Append param    Set rs4 = cmd.Execute()    MsgBox rs4.RecordCount    Set DataGrid1.DataSource = rs4    DataGrid1.Refresh
End Sub

解决方案 »

  1.   

    Execute()方法返回的记录集,recordcount=-1
    请使用EOF属性判断:
    dim i as long 
    rs.movefirst
    do while not rs4.eof
        i=i+1
        rs4.movenext
    loop
    msgbox i
      

  2.   

    说过了,就是-1,execute方法返回的结果集是这样
      

  3.   

    如果是-1那Set DataGrid1.DataSource = rs4这句就会提示错误了
    我对存储过程只是从网上实例套过来的,请高手帮我看看是不是程序有问题,我总觉得是变量带的不对
      

  4.   

    不会提示错误,也不代表-1有什么问题.这个是ADO内置的规则,与你的程序后面执行什么无关.
    如果游标类型不支持 RecordCount,则该属性返回 –1;
    对仅向前游标,RecordCount 属性将返回 -1;
    对静态或键集游标返回实际计数,对动态游标取决于数据源返回 -1 或实际计数。
      

  5.   

    连接对象使用客户端游标即可,实例化连接对象后,加一句:
    ADOCN.CursorLocation = adUseClient
      

  6.   

    由Execute方法返回的游标继承连接对象的CursorLocation设置。Recordset将自动从与之关联的连接中继承该设置。
      

  7.   

    LZ的这个代码原本一定没有MsgBox rs4.RecordCount这句吧.
    7F不错,那是将游标类型改变了.
      

  8.   

    加上ADOCN.CursorLocation = adUseClient这句就行了,虽然不知道是什么意思,但能用就行哈