存储过程中 利用游标取出多个SELECT 结果集,结果集数目不定,vc程序只需要最后一个结果集 ,不是知道 ado 的 recordset 对象如何只取最后一个结果集,或者是 如何让存储过程 只返回最后一个select 结果集? 请高手解救?

解决方案 »

  1.   

    首先确定几个问题,你的存储过程如何返回记录集1.在存储过程中的出口是1条或多条select ....语句,且中间没有return语句2.使用了输出参数为游标的存储过程
      

  2.   

    如果存储过程只返回一个记录集
    那么在存储过程的出口只能有一条独立的select语句,且之前后之后不能有return或者print
      

  3.   

    while( NULL != res )
    {
    //记录集打开
    if(res->GetState() == ADODB::adStateOpen)
    {
    //有数据
    //return ( VARIANT_FALSE==res->GetIsEOF() );
                return TRUE;    //是否有记录由调用者负责 2006-9-14
    }
    //下一个记录集
    res = res->NextRecordset(NULL);
    }
      

  4.   

    是多条select ....语句,且中间没有return语句
      

  5.   

    if(FAILED(::CoInitialize(NULL))) 
    return; 
    try
    {//定义connection, recordset,command对象
    _ConnectionPtr  pConn  = NULL ;
    _RecordsetPtr  pRs  = NULL ;
    _RecordsetPtr  pRs2  = NULL ;
    _CommandPtr comm = NULL ;
    _ParameterPtr param =NULL ;
    HRESULT  hr = S_OK;

    _bstr_t strCnn("Driver={SQL Server};Server=(local);Uid=sa;Pwd=;DataBase=test"); pConn.CreateInstance(__uuidof(Connection));
    pConn->CursorLocation =adUseClient;
    pConn->ConnectionTimeout =60;
    comm.CreateInstance(__uuidof(Command));
    param.CreateInstance(__uuidof(Parameter));
    //pRs.CreateInstance(__uuidof(Recordset)); pConn->Open (_bstr_t(strCnn),_bstr_t(""),_bstr_t(""),adModeUnknown);

    comm->ActiveConnection=pConn;
    comm->CommandType=adCmdStoredProc;
    comm->CommandText="proc_test";
    //param = comm->CreateParameter ("@ID",adInteger,adParamInput,9,lpsub->id);
    //comm->Parameters->Append(param);
    //param = comm->CreateParameter ("@issuccess",adVarChar,adParamInput,8,bisSuccess);
    //comm->Parameters->Append(param);
    //param = comm->CreateParameter ("@ErrCode",adVarChar,adParamInput,10,bErrCode );
    //comm->Parameters->Append(param);

    //运行存储过程,得到pRs记录集包含多个记录集,存储过程proc_test,select 2个表,返回了2个记录集
    pRs=comm->Execute(NULL,NULL,adCmdStoredProc);
    //第一个记录集的遍历
    for(int i=0;!pRs->EndOfFile;pRs->MoveNext(),i++)
    {
    _variant_t vExp1;
    vExp1=pRs->Fields->Item["exp1"]->Value; TRACE("%d:%s\n",i,(LPCTSTR)(_bstr_t)vExp1);
    }

    //得到第二个记录集,pRs2
    _variant_t vta=0;
    pRs2=pRs->NextRecordset(&vta);
    //第二个记录集遍历
    for(int i=0;!pRs2->EndOfFile;pRs2->MoveNext(),i++)
    {
    _variant_t vExp1;
    vExp1=pRs2->Fields->Item["exp1"]->Value;
    TRACE("%d:%s\n",i,(LPCTSTR)(_bstr_t)vExp1);
    }
    //关闭所有打开的对象
    if (pRs)
    if (pRs->State == adStateOpen)
    pRs->Close();
    if (pRs2)
    if (pRs2->State == adStateOpen)
    pRs2->Close();
    if (pConn)
    if (pConn->State == adStateOpen)
    pConn->Close();
    }
    catch (_com_error pCome)
    {
    TRACE("Error info: %s \n", (LPCTSTR)(pCome.Description()));}
    ::CoUninitialize();