关于存储过程的ADO调用的一些心得(输出参数,返回值)

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

在一个项目中,我需要用到存储过程来访问数据,为了提供一个比较一致的接口以便调用,我没有使用CreateParameter(),而是调用CommandPtr的Refresh()函数先从中查询参数.
_ConnectionPtrm_pConn;
m_pConn.CreateInstance(__uuidof(Connection));
m_pConn->Open("driver={};server=127.0.0.1;DATABASE=pub;UID=sa;PWD=", "","",0);

_CommandPtr m_pCommand;
m_pCommand.CreateInstance(__uuidof(Command));
_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recordset));

m_pCommand->ActiveConnection=m_pConn;
m_pCommand->CommandText="SP_XX";//存储过程名
m_pCommand->PutCommandType(adCmdStoredProc);
m_pCommand->Parameters->Refresh();//从数据库查询参数信息


接下来就可以对每一个参数赋值了:
longcnt=m_pCommand->Parameters->GetCount();//取得参数的个数
for(longk=1;k<cnt;k++)
{//由于 ADO中认为 返回值是第一个参数,因此这里用k=1滤掉第一个参数
 m_pCommand->Parameters->GetItem(k)->Value=XXX;//按存储过程的参数顺序给参数赋值
}


现在可以执行这个存储过程了
m_pRecordset=m_pCommand->Execute(0,0,adCmdStoredProc);
这个时候,如果接下来用
_variant_t ret_val=m_pCommand->Parameters->GetItem((long)0)->Value;
那么将得不到值
而如果像下面这样调用的话就可以得到 返回值
m_pRecordset->Close();
_variant_toutput_para=m_pCommand->Parameters->GetItem((long)0)->Value;
MS ADO.net给这一现象的回复是:
 Youcanthinkofastoredprocedureasafunctioninyourcode.Thefunctiondoesn’treturnavalueuntilithasexecutedallofitscode.Ifthestoredprocedurereturnsresultsandyouhaven’tfinishedprocessingtheseresults,thestoredprocedurehasn’treallyfinishedexecuting.Untilyou’veclosedtheDataReader,thereturnandoutputparametersofyourCommandwon’tcontainthevaluesreturnedbyyourstoredprocedure.
也就是说Execute()函数应该看成是直到m_pRecordset关掉以后才会正确返回.

关于 输出参数的处理也和这一样,因为 返回值本身就是当成 输出参数来处理的.
通过这种方法,我们可以得到一个存储过程的 返回值和结果集,而且对于所有的存储过程都可以一样使用,不必为某个特定的存储过程去写代码,具有一定的通用性.

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值