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