存储过程的返回值可分为三种情况:无返回值,参数返回以及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: 参数的值,如果为输入参数,则这个为输入参数的值(数据),如果为输出参数,则省略次参数