用sql查询分析器调用我这个存储过程,并且得到返回值我是这样写的:
use metadatadeclare @status integer,
        @code_R varchar(10)execute @status = ExamExist 
                  '05010102',
                  @code_R OUTPUTif @status = 1
   print  @status
else if @status = 0
   print  @status而我在VB中,是这样写的:
Dim mycommand1 As New ADODB.command
    Dim parm_code As ADODB.Parameter   '第一个参数
    Dim parm_code_R As ADODB.Parameter   '第二个参数,为output
    mycommand1.ActiveConnection = m_cnnDB
    
     '-----------------对第一个参数进行设置-------------------
    Set parm_code = New ADODB.Parameter
    parm_code.Type = adVarChar
    parm_code.Size = 10
    parm_code.Direction = adParamInput
    parm_code.Value = entity_code
    mycommand1.Parameters.Append parm_code   '加入一个参数
    '-----------------对第二个参数进行设置-------------------
    Set parm_code_R = New ADODB.Parameter
    parm_code_R.Type = adVarChar
    parm_code_R.Size = 10
    parm_code_R.Direction = adParamOutput
    mycommand1.Parameters.Append parm_code_R   '增加第二个参数
    
    Dim ReturnResult As Integer
       
    mycommand1.CommandText = "ExamExist"
    mycommand1.CommandType = adCmdStoredProc
    
    ReturnResult = mycommand1.Execute   '提示这一句有错误
最后一句有错误,错误的原因是:类型不匹配,我想在sql查询分析器中我得到的返回值也是定义为integer,而在VB中怎么就不行呢??

解决方案 »

  1.   

    不至于这么复杂吧,直接使用ado的connection对象的excute方法就可以了,比如:
    dim iResult as integeriresult=cnn.excute ("exec add(1,2)")
    其中esxcute方法中要求是一个字符串,即为你需要执行的sql语句,我影响当中用sql语句执行一个存储过程是用exec,但很久没用,可能记错了,但基本原理就是这样。
      

  2.   

    to AresChen(AresChen) : 
         也是返回类型也匹配这样一个错误
    to liaorui(更烦得很~ξ) :
         你说得方法如果返回的是记录集是这样得,可是我现在返回的不是记录集,而是一个整形值
         这在我用sql查询分析器中的用法中可以看出来。
      

  3.   

    把我前面的例子中的定义改成这样:dim iResult as Variant,这样应该不会出错,然后你可以跟一下iResult中的值到底是什么,看看是不是SQL的数据类型和VB的数据类型之间的不符造成的。
      

  4.   

    '函数:function :AllrstGetDataEX
    '功能:根据一个传入参数(存储过程)取得相应的记录集
    '输入:参数StrSQL,colprm
    '参数:StrSQL调用的存储过程
    '参数:colprm储存过程调用的参数
    '      retval 为返回值
    '      retmsg 为返回信息
    '返回:存储过程里定义的记录集
    '修改日志:
    '日期                   修改原因                修改人
    '-------------------------------------------------------
    '********************************************
    Public Function AllrstGetDataEX(ByVal strSql As String, ByVal colprm As Collection, ByRef retval As Long, ByRef retmsg As String) As ADODB.Recordset
        On Error GoTo ErrHandle
        Dim cmd As New ADODB.Command
        Dim rst As ADODB.Recordset
        Dim strTmp As String
        Dim lngx As Long
        Dim lngy As Long
        Set cmd.ActiveConnection = CnXYXTGL
        cmd.CommandTimeout = 18000
        cmd.CommandText = strSql
        cmd(0).Direction = adParamReturnValue
        lngy = colprm.Count
        For lngx = 1 To lngy
            If lngx = lngy Then
                If colprm.Item(lngy) = "****" Then
                    cmd(lngx).Direction = adParamOutput
                Else
                    cmd(lngx).Value = colprm.Item(lngx)
                End If
            Else
                cmd(lngx).Value = colprm.Item(lngx)
            End If
        Next
        Dim i As Integer
        Set rst = cmd.Execute()
        retval = cmd(0)
        If cmd.Parameters.Count = 6 Then
            retmsg = cmd(5)
        Else
            If retval = 0 Then
                retmsg = "执行成功"
            Else
                retmsg = "执行出错"
            End If
        End If
        Set AllrstGetDataEX = rst
        Set rst = Nothing
        Exit Function
    ErrHandle:    retval = Err.Number
        retmsg = Err.Description
    End Function
    调用举例:
        Dim colprm As New Collection
        Dim strSql As String
        Dim retval As Long
        Dim retmsg As String
        Dim rst as ADODB.recordsets    colprm.Add mstrJGDM         '将4个参数加入集合
        colprm.Add mstrUserID
        colprm.Add db
        colprm.Add SQL
        strSql = "{?=call P_GY_WH_RPC(?,?,?,?)}"
            Set rst = AllrstGetDataEX(strSql, colprm, retval, retmsg)
        Exit Sub其中P_GY_WH_RPC 为存储过程名 需要4个参数:mstrJGDM mstrUserID db SQL
      
      

  5.   


     VB中获得存储过程的返回值有两种方式:
      1) 存储过程直接用select语句返回,在VB中用recordset接收
      2) 存储过程中有out参数,在VB中用command对象接收
         变量= cmd.parameters("参数").value
      

  6.   

    to little_sophy(晓晓)    我知道是记录集.那记录集里不就是你要的返回值吗.
       楼上的已经说的很清楚了.
      

  7.   

    如果要得到返回值,需要用Command的方法。
    首先说明,返回值有两种。一种是在存储过程中直接return一个值,就象C和VB的函数返回值那样;另一种是可以返回多个值,存储这些值的变量名称需要在调用参数中先行指定。
    这个例子要处理多种参数,输入参数,输出参数,返回记录集以及一个直接返回值(够全了吧?)
    存储过程如下:use pubs
    GO-- 建立存储过程
    create procedure sp_PubsTest-- 定义三个参数变量,注意第三个,特别标记是用于输出
    @au_lname varchar (20), 
    @intID int,
    @intIDOut int OUTPUTASSELECT @intIDOut = @intID + 1SELECT * 
    FROM authors 
    WHERE au_lname LIKE @au_lname + '%'--直接返回一个值
    RETURN @intID + 2
    调用该存储过程的asp程序如下:<%@ Language=VBScript %>
    <%
    Dim CmdSP
    Dim adoRS
    Dim adCmdSPStoredProc
    Dim adParamReturnValue
    Dim adParaminput
    Dim adParamOutput
    Dim adInteger
    Dim iVal
    Dim oVal
    Dim adoField
    Dim adVarChar‘这些值在 VB 中是预定义常量,可以直接调用,但在 VBScript 中没有预定义
    adCmdSPStoredProc = 4
    adParamReturnValue = 4
    adParaminput = 1
    adParamOutput = 2
    adInteger = 3
    adVarChar = 200iVal = 5
    oVal = 3'建一个command对象
    set CmdSP = Server.CreateObject("ADODB.Command")'建立连结
    CmdSP.ActiveConnection = "Driver={SQL Server};server=(local);Uid=sa;Pwd=;Database=Pubs"'定义command 对象调用名称 
    CmdSP.CommandText = "sp_PubsTest"'设置command调用类型是存储过程 (adCmdSPStoredProc = 4)
    CmdSP.CommandType = adCmdSPStoredProc'往command 对象中加参数
    '定义存储过程有直接返回值,并且是个整数,省缺值是4
    CmdSP.Parameters.Append CmdSP.CreateParameter("RETURN_VALUE", adInteger, adParamReturnValue, 4)
    '定义一个字符型输入参数
    CmdSP.Parameters.Append CmdSP.CreateParameter("@au_lname", adVarChar, adParaminput, 20, "M")
    '定义一个整型输入参数
    CmdSP.Parameters.Append CmdSP.CreateParameter("@intID", adInteger, adParamInput, , iVal)
    '定义一个整型输出参数
    CmdSP.Parameters.Append CmdSP.CreateParameter("@intIDOut", adInteger, adParamOutput, oVal)'运行存储过程,并得到返回记录集
    Set adoRS = CmdSP.Execute
    '把每个记录打印出来,其中的字段是虚拟的,可以不用管
    While Not adoRS.EOFfor each adoField in adoRS.Fields
    Response.Write adoField.Name & "=" & adoField.Value & "<br>" & vbCRLF
    Next
    Response.Write "<br>"
    adoRS.MoveNext
    Wend'打印两个输出值:
    Response.Write "<p>@intIDOut = “ & CmdSP.Parameters("@intIDOut").Value & "</p>"
    Response.Write "<p>Return value = " & CmdSP.Parameters("RETURN_VALUE").Value & "</p>"
    '大扫除
    Set adoRS = nothing
    Set CmdSP.ActiveConnection = nothing
    Set CmdSP = nothing
    %>