用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中怎么就不行呢??
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中怎么就不行呢??
dim iResult as integeriresult=cnn.excute ("exec add(1,2)")
其中esxcute方法中要求是一个字符串,即为你需要执行的sql语句,我影响当中用sql语句执行一个存储过程是用exec,但很久没用,可能记错了,但基本原理就是这样。
也是返回类型也匹配这样一个错误
to liaorui(更烦得很~ξ) :
你说得方法如果返回的是记录集是这样得,可是我现在返回的不是记录集,而是一个整形值
这在我用sql查询分析器中的用法中可以看出来。
'功能:根据一个传入参数(存储过程)取得相应的记录集
'输入:参数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
VB中获得存储过程的返回值有两种方式:
1) 存储过程直接用select语句返回,在VB中用recordset接收
2) 存储过程中有out参数,在VB中用command对象接收
变量= cmd.parameters("参数").value
楼上的已经说的很清楚了.
首先说明,返回值有两种。一种是在存储过程中直接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
%>