我用一个_CommandPtr对象的Execute方法执行一个存储过程,返回一个_RecordsetPtr对象,这个结果记录集怎么只能MoveNext()不能MoveFirst(),如果我想这个记录集可能随便移动。该怎么办?

解决方案 »

  1.   

    应该是可以MoveFirst的
    随便移动是不行的只能靠MoveNext操作
      

  2.   

    应该是可以的,SQL Server数据库我试过是支持的。Oracle不支持直接返回记录集,得使用游标对象,比较麻烦。
      

  3.   

    关键代码如下:        try
    {
    pParam = pCmd->CreateParameter(_T("strIn"),adVarChar,adParamInput,200,value);
    pCmd->Parameters->Append(pParam);
    pRs = pCmd->Execute(NULL,NULL,adCmdStoredProc );
    }
    catch(_com_error &e)
    {
    if(pConn != NULL && pConn->GetState() == adStateOpen)
    {
    pConn->Close();
    }
    if(pRs != NULL && pRs->GetState() == adStateOpen)
    {
    pRs->Close();
    }
    #ifdef DEBUG
    PrintComError(e);
    #endif
    AfxMessageBox(_T("查询数据失败!"));
    return;
    }

    if(pRs == NULL)
    {
    if(pConn->GetState() == adStateOpen)
    {
    pConn->Close();
    }
    AfxMessageBox(_T("查询数据发生未知错误!"));
    return;
    } long lCount = pRs->GetRecordCount();
    if(lCount == -1)
    {
    lCount = 0;
    pRs->MoveFirst();
    while(!pRs->IsEOF)
    {
    pRs->MoveNext();
    lCount++;
    }
    }
    if(lCount < 1)
    {
    if(pConn != NULL && pConn->GetState() == adStateOpen)
    {
    pConn->Close();
    }
    if(pRs != NULL && pRs->GetState() == adStateOpen)
    {
    pRs->Close();
    }
    return;
    }
            //......
            try
    {
    pRs->MoveFirst();     //这一步出现异常,异常信息:行集位置不能被重新启动(80040e18)
    }
    catch(_com_error &e)
    {
    #ifdef DEBUG
    PrintComError(e);
    #endif
    if(pConn != NULL && pConn->GetState() == adStateOpen)
    {
    pConn->Close();
    }
    if(pRs != NULL && pRs->GetState() == adStateOpen)
    {
    pRs->Close();
    }
    return;
    }
    是不是游标的问题?如果是,那么这种情况该怎么设置游标?
      

  4.   

    连的是sqlserver
    问题找到了,是游标的问题。
    Command.Execute返回的记录集游标类型默认为adForwordOnly,所以不支持向后移动。
    这个时候可能在连接对象里设置游标pConn->CursorLocation = adUseClient;
    结了