使用_commandPtr 處理存儲過程時,當在存儲過程中需要返回結(jié)果集合和返回參數(shù)時,一般在任何語言調(diào)用的ado中
存儲過程控件都無法同時返回,這里http://www.pkvs.com/data/mssql/19323.html給了我們答案。
使用CreateParameter(),而是調(diào)用CommandPtr的Refresh()函數(shù)先從數(shù)據(jù)庫中查詢參數(shù).
_ConnectionPtr
m_pConn;
m_pConn.CreateInstance(__uuidof(Connection));
m_pConn->Open("driver={SQL
Server};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(); //從數(shù)據(jù)庫查詢參數(shù)信息
//我不建議使用refresh,這個內(nèi)部的處理速度還不如用createparamter好,
long
cnt = m_pCommand->Parameters->GetCount();//取得參數(shù)的個數(shù)
for(long
k=1;k<cnt;k++)
{ //由于ADO中認為返回值是第一個參數(shù),因此這里用k=1濾掉第一個參數(shù)
m_pCommand->Parameters->GetItem(k)->Value
= XXX;//按存儲過程的參數(shù)順序給參數(shù)賦值
}
以執(zhí)行這個存儲過程了,返回m_pRecordset將返回集合,
m_pRecordset =
m_pCommand->Execute(0,0,adCmdStoredProc);
這個時候,如果接下來用
_variant_t ret_val
=
m_pCommand->Parameters->GetItem((long)0)->Value;
那么將得不到值
而如果像下面這樣調(diào)用的話就可以得到返回值了
m_pRecordset->Close();
_variant_t
output_para = m_pCommand->Parameters->GetItem((long)0)->Value;
MS
ADO.net給這一現(xiàn)象的回復是:
You can think of a stored procedure as a function in your
code. The function doesn’t return a value until it has executed all of its code.
If the stored procedure returns results and you haven’t finished processing
these results, the stored procedure hasn’t really finished executing. Until
you’ve closed the DataReader, the return and output parameters of your Command
won’t contain the values returned by your stored
procedure.
也就是說Execute()函數(shù)應該看成是直到m_pRecordset關(guān)掉以后才會正確返回.