<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>
在一个项目中,我需要用到存储过程来访问数据,为了提供一个比较一致的接口以便调用,我没有使用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>