來自:http://songlia2.blog.hexun.com/13095398_d.html
今天有同志問我這個問題,據說是取不到返回參數,于是連抄帶寫,胡亂寫了點代碼測試一下,完整代碼如下(有一段時間沒怎么用VC,寫的不好,見笑一下):
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
CoInitialize(NULL);
_ConnectionPtr pConnection = NULL;
_CommandPtr pCommand = NULL;
_RecordsetPtr pRecordset = NULL;
_ParameterPtr pParameter = NULL;
try
{
pConnection.CreateInstance(__uuidof(Connection));
pParameter.CreateInstance(__uuidof(Parameter));
pCommand.CreateInstance( __uuidof(Command));
pConnection->Open(CONNECTION_STRING,"sa","",-1);
pCommand->ActiveConnection = pConnection;
pCommand->CommandType = adCmdStoredProc;
_bstr_t storename("test");
pCommand->put_CommandText(storename);
pCommand->Parameters->Append(pCommand->CreateParameter("@value",
adVarChar, adParamInputOutput, 50, "what"));
pRecordset = pCommand->Execute(NULL, NULL, adCmdStoredProc);
while(!(pRecordset->GetadoEOF()))
{
<!-- Inject Script Filtered -->
_bstr_t strRecord = pRecordset->Fields->GetItem("record")->GetValue().bstrVal;
CString value = strRecord;
TRACE("result: %s\n", value) ;
pRecordset->MoveNext();
}
TRACE("recordcount: %d\n", pRecordset->RecordCount);
pRecordset->Close();
CString out(pCommand->Parameters->GetItem(_variant_t("@value"))->GetValue().bstrVal);
TRACE("return : %s", out);
}
catch(_com_error err)
{
TRACE("error: %s", err.Description());
pConnection->Close();
}
::CoUninitialize();
return nRetCode;
}
通過測試最終發現,執行存儲過程時需調用Command對象的Execute方法,該方法返回一個RecordSet對象,但我發現這個
RecordSet對象盡管是有內容的,但是RecordCount的值是-1,不知道是為什么.在取返回參數之前,必須把這個RecordSet關閉,
否則是取不到返回參數的.
今天又上了一課了.