存储过程的返回值可分为三种情况:无返回值,参数返回以及return返回,下面我会对三种存储过程的调用分别说明。

数据库中已经有了以下三个存储过程:

1.InsertLine  //插入一条数据,且不用返回值

CREATE PROCEDURE InsertLine  
@oneValule varchar(50)  --定义要插入的参数
As begin tran 
insert into myTable(字段名) --插入语句
values(@oneValule  )
commit GO




2. QueryLine  //查找一条数据,参数返回查到的记录数

CREATE Procedure QueryLine  
@key char(10), --查找关键字
@flag int output --返回值(注意用output)
As begin tran 
set @flag = (select count(*) from M_Navigation_Line \
where start_point = @startPoint and end_point = @endPoint) --查询并赋值
commit GO




3. CountLine //return返回记录数


CREATE Procedure CountLine  
As begin tran 
Declare @nCount int
Set @nCount = (select count(*) from myTable)
Return nCount
commit GO




接下来看源代码,先在源文件头部加入这样一条语句:

#import "c:\program files\common files\system\ado\msado15.dll" \
no_namespace rename("EOF","adoEOF")


然后,声明与调用存储过程相关的类

CoInitialize(NULL); 
_ConnectionPtr pMyConnect(__uuidof(Connection));
_RecordsetPtr pRst(__uuidof(Recordset));
try 
{ 
pMyConnect-> Open( "DSN=databasename", "sa", "123",adModeUnknown);
 } 
catch (_com_error &e)
{
     AfxMessageBox(e.Description()); exit(0); 
}
_CommandPtr m_pCommand;
m_pCommand.CreateInstance("ADODB.Command"); 
m_pCommand->ActiveConnection = pMyConnect; 
m_pCommand->CommandText = "InsertLine"; 
 _ParameterPtr oneValule ; 
oneValule.CreateInstance("ADODB.Parameter");
oneValule = m_pCommand->CreateParameter("oneValule ",
                     adVarChar,adParamInput,10,(_variant_t)“传入的值”);
m_pCommand->Parameters->Append(oneValule );
m_pCommand->Execute(NULL,NULL,adCmdStoredProc); 
oneValule ->Release(); 
pMyConnect->Close();
CoUninitialize();




如果需要获得存储过程的返回值,如调用抵用第二个存储过程其他步骤相同,把存储过程的名字改成QueryLine ,这时候有两个参数要配置,一个是输入参数,还有一个输出参数

_ParameterPtr key; 
key.CreateInstance("ADODB.Parameter");
key= m_pCommand->CreateParameter("key",adVarChar,adParamInput,
                                         10,(_variant_t)“key值”);
m_pCommand->Parameters->Append(ePoint);
_ParameterPtr flag;
flag.CreateInstance("ADODB.Parameter"); 
flag=m_pCommand->CreateParameter("flag",adInteger,adParamOutput,sizeof(long)); 
m_pCommand->Parameters->Append(flag); 
m_pCommand->Execute(NULL,NULL,adCmdStoredProc); 
int retValue = (long)m_pCommand-> Parameters-> GetItem("flag")-> GetValue(); 
pMyConnect->Close(); 
CoUninitialize();





获取存错过程的return返回值的过程与上一个有一点区别,其实return返回值,我们也可以把他看作是一个参数,具体的代码如下:

_CommandPtr m_pCommand;
m_pCommand.CreateInstance("ADODB.Command"); 
m_pCommand->ActiveConnection = pMyConnect; 
m_pCommand->CommandText = "CountLine"; 
 
_ParameterPtr returnValue; 
returnValue.CreateInstance("ADODB.Parameter");
returnValue= m_pCommand->CreateParameter("return",adVarChar,adParamReturnValue,sizeof(int));
m_pCommand->Parameters->Append(returnValue);
m_pCommand->Execute(NULL,NULL,adCmdStoredProc); 
int retValue = (long)m_pCommand-> Parameters-> GetItem("return")-> GetValue(); 
pMyConnect->Close(); 
CoUninitialize();




调用存储过程步骤如下

一、设置command的相关链接参数

二、设置command的执行命令,也就是存储过程的名称

三、添加存储过程的参数(这里是重点)

a) 创建参数变量

b) 创建参数(注意CreateParameter的用法)

c) 添加参数

d) 注意:参数的添加顺序必须与存储过程的参数顺序一致

四、执行存储过程

五、获取返回值

CreateParameter详解

函数原型:

CreateParameter ( _bstr_t Name, enum DataTypeEnum Type, 
<span style="white-space:pre">		</span>enum ParameterDirectionEnum Direction, 
<span style="white-space:pre">		</span>ADO_LONGPTR Size, const _variant_t & Value )




参数说明:

Name: 字段名称,根据Direction参数的不同意义不同,当为adParamInput时,Name为存储过程参数名称,当为adParamOutput/adParamReturnValue时,为输出的字段名称。

Type:  参数数据类型,即输入/输出参数的数据类型(adVarChar,最好用可以适应很多其他类型)

Direction: 参数类型,说明该参数是输入参数还是输出参数等

Size:

Value: 参数的值,如果为输入参数,则这个为输入参数的值(数据),如果为输出参数,则省略次参数