來自: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關閉, 否則是取不到返回參數的.

今天又上了一課了.