add an adParamReturnValue parameter, see 
http://support.microsoft.com/support/kb/articles/Q194/7/92.ASP

解决方案 »

  1.   

        Dim cmdTest As ADODB.Command
        Dim parIn As ADODB.Parameter
        Dim parOut As ADODB.Parameter
        
        Set cmdTest = New ADODB.Command
        
        cmdTest.Prepared
        
        '输入参数用 adParamInput,其中名称,类型长度和值按你的需要来写
        Set parIn = cmdTest.CreateParameter(名称, 类型, adParamInput, 长度, 值)
        cmdTest.Parameters.Append parIn
        
        '输入参数用 adParamOutput
        Set parOut = cmdTest.CreateParameter("输出参数", 类型, adParamOutput, 长度, 值)
        cmdTest.Parameters.Append parOut
        
        cmdTest.Execute
        
        MsgBox cmdTest.Parameters("输出参数"), vbInformation
      

  2.   

        MsgBox cmdTest.Parameters("输出参数").Value , vbInformation
      

  3.   

    如果是ado的话
    采用parameter对象
    比如dim cmd as adodb.command
    dim param1 as adodb.parameter
    dim param2 as adodb.parametercmd.commandtext="存储过程名"
    cmd.commandtype=adcmdstoredproc
    'param1返回值 param2传入参数
    set param1=cmd.createparameter("Return",adinteger,adparamreturnvalue)
    set param2=cmd.createparameter("col1",adbstr,adparaminput)param2.value=传入值cmd.parameters.append param1
    cmd.parameters.append param2cmd.execute
      

  4.   

    TO:foolishtiger(吴文智) 
    To:sqstudio_zsp(镇山炮) 
    请再帮我看一下。这两天我试验了下你们给出的代码,自己也找书研究了一下,
    但还是不能解决。代码如下:Private Sub Command1_Click()
        Dim cn As New ADODB.Connection
        Dim cmdTest As ADODB.Command
        Dim parIn As ADODB.Parameter
        Dim parOut As ADODB.Parameter
        
        cn.Open "driver={SQL Server};server=server;uid=sa;pwd=sa;database=hs"
        Set cmdTest = New ADODB.Command
        
        cmdTest.CommandText = "lsh" 'lsh为存储过程名
        cmdTest.CommandType = adCmdStoredProc
        Set parIn = cmdTest.CreateParameter("abc", adInteger,adParamInput)     
        cmdTest.Parameters.Append parIn    
        '输入参数用 adParamOutput
        Set parOut = cmdTest.CreateParameter("return",adBSTR,adParamReturnValue)    
        cmdTest.Parameters.Append parOut
        
        cmdTest.Execute
        
        MsgBox cmdTest.Parameters("return").Value, vbInformation
    End Sub
    当执行到cmdtest.execute那句提示:
        连接无法用于执行此操作。在此上下文中它可能已被关闭或无效。
      

  5.   

    漏了
    Set adoTest.ActiveConnection = cn
      

  6.   

    To:foolishtiger(吴文智)
    To:sqstudio_zsp(镇山炮)
    请再帮我看看,这两天我试验了一下你们给出的代码,自己也找书看了看,但还是
    没有解决问题,代码如下:
    Private Sub Command1_Click()
        Dim cn As New ADODB.Connection    Dim cmdTest As ADODB.Command
        Dim parIn As ADODB.Parameter
        Dim parOut As ADODB.Parameter
        cn.Open "driver={SQL Server};server=server;uid=sa;pwd=sa;database=hs"
        
        Set cmdTest = New ADODB.Command
        
        cmdTest.CommandText = "lsh" 'lsh为存储过程名
        cmdTest.CommandType = adCmdStoredProc    Set parIn = cmdTest.CreateParameter("abc", adInteger, adParamInput)    
        cmdTest.Parameters.Append parIn
            Set parOut = cmdTest.CreateParameter("return", adBSTR,adParamReturnValue)
        cmdTest.Parameters.Append parOut
        
        cmdTest.Execute
        
        MsgBox cmdTest.Parameters("return").Value, vbInformation
    End Sub
    当执行到cmdTest.Execute时提示:
        连接无法用于执行此操作,在此上下文中它可能已被关闭或无效。
      

  7.   

    TO:sqstudio_zsp(镇山炮) 
    还是不行,加了那句:Set adoTest.ActiveConnection = cn(根据我的变量名不同,我
    将其改为:Set cmdTest.ActiveConnection = cn 后,
    又提示:为过程或函数lsh指定的参数太多。
      

  8.   

    你怎么回事?
    你当然需要先在你的这个“lsh”的存储过程中加一个类型是
    Output的参数啦!如果你的存储过程没有输出参数,怎么可能光在
    VB里面做点东东就能获得返回值了呢?????例程:
    Create Proedure Test
    @iReturn as int [output]
    as
    set @iReturn=100完了!
      

  9.   

    我已经增加了,我的存储过程内容为:
    CREATE PROCEDURE dbo.lsh @hao as int output
     AS
        select * from 流水号表
        update 流水号表 set @hao=流水号, 流水号=流水号+1
    GO
    请再帮看看
      

  10.   

    各位高手,帮帮忙嘛。up,up,up,
      

  11.   

    获得存储过程的返回值方法其实很简单,只要你能做到
    两点,绝对不可能得不到返回值:(现在我并不确定你
    已经做到)
    1。保证你对ADOCommand对象添加的参数和你的存储过程中
    定义的数量相等、类型匹配;
    2。用来获取返回值的参数对象的Direction属性不应是
    adParamReturnValue,而应是adParamOutput
      

  12.   

    '以下是Rdo方式,Ado差不多,自己去改写吧dim con as rdoconnection
    dim sSql as string
    dim Qry as rdoqueryset con= rdoenvironments(0).openconnection("pubs")
    sSql="{ 返回值 = call 存储过程名(参数1,参数2) }"
    set qry = con.createQuery(" ",sSql)qry(0).direction = rdParamReturnValue '返回值
    qry(1).direction = raParamInput '输入
    qry(2).direction = rdParamOutput '输出qry(1)="传入值"qry.executemsgbox "存储过程返回值" & qry(0)
    msgbox "存储过程输出值" & qry(2)
      

  13.   

    TO:junglerover(灌木丛) 
    我觉得我已经按照你说的去做了,但还是不行,请再帮看看。现在的代码为:
    Private Sub Command1_Click()
        Dim cmdTest As ADODB.Command
        Dim parIn As ADODB.Parameter
        Dim parOut As ADODB.Parameter
        
        Set cmdTest = New ADODB.Command
        Set cmdTest.ActiveConnection = cn    cmdTest.CommandText = "lsh"
        cmdTest.CommandType = adCmdStoredProc    Set parIn = cmdTest.CreateParameter("abc", adInteger, adParamInput) 
        cmdTest.Parameters.Append parIn
        
        '输入参数用 adParamOutput
        Set parOut = cmdTest.CreateParameter("return", adInteger, adParamOutput) 
        cmdTest.Parameters.Append parOut
        
        cmdTest.Execute
        
        MsgBox cmdTest.Parameters("return").Value, vbInformation
    End Sub存储过程为:
    CREATE PROCEDURE dbo.lsh @hao as int output
     AS
        select * from 流水号表
        update 流水号表 set @hao=流水号, 流水号=流水号+1
    GO
      

  14.   

    TO:wlk(温水) 
    不好意思,RDO我没有研究过,你能否给出一段ADO的代码呢?
      

  15.   

    调用存储过程应该是很简单吧
    Dim cmm As New ADODB.Command
        With cmm
            .ActiveConnection = '连接
            .CommandType = adCmdStoredProc
            .CommandText = '存储过程名称
            .Parameters(1).Value = '参数1值
            .Parameters(2).Value = '参数2值
            .Execute
            reValue = .Parameters(0).Value '默认返回值
            strResult = .Parameters(7).Value '存储过程中对应的返回值
        End With
        Set cmm = Nothing
      

  16.   

    TO:javavbling(言回) 
    谢谢!!!能不能写详细一点,我对COMMAND对象一点都不熟悉。
      

  17.   

    我昨天贴的帖子怎么没了?还好我有备份。
    以下是昨天我贴的帖子。怎么我在这里说,说了又说,你就是一点都听不进去呢?
    我已经告诉了你,应该:
    保证你对ADOCommand对象添加的参数和你的存储过程中
    定义的数量相等、类型匹配而看你的程序:
    VB调用过程中提供了两个参数,一个IN的,一个OUT的
    存储过程只有一个参数,OUT的。
    这个也叫做“数量相等,类型匹配”??????????????????要是这样也能不出错,我简直要一头撞死了。
      

  18.   

    TO:junglerover(灌木丛) 
    非常感谢,终于解决了,看来太粗心了,竟然没有注意到多了一个参数。哈哈哈
    再次表示感谢!!!!这些分我也给其他人一点,因为他们毕竟也帮了我,你不会介意吧?
      

  19.   

    TO:junglerover(灌木丛) 
    非常感谢,终于解决了,看来太粗心了,竟然没有注意到多了一个参数。哈哈哈
    再次表示感谢!!!!这些分我也给其他人一点,因为他们毕竟也帮了我,你不会介意吧? 
      

  20.   

    (我对command对象不熟悉)
    我有一个存储过程
    create proc is_user @username varchar(10),@userid varchar(10) as
     declare @result integer
     /*user 为表名,username 和 usrid 都为字段名*/
     select * from user where username=@username and userId=@userid
    if @@rowcount=0
      set @result=0
    else
      set @result=@@rowcount最后。我想在VB中得到@result的值应该怎么做?
    我的存储过程还有缺陷吗?
    请指点