我原来的处理方式是:一条消息过来执行一次数据库速度较慢,现在想进行批处理;一次执行多条消息:也就是将执行用户存储过程消息中的字段:
但不知怎么解析处理得到的结果集,,然后给每条消息返回相应的应答。
在MSDN中说:批处理是重复着dbrpcinit,
dbrpcparam()俩函数后执行并返回结果集,现在的疑问是我如何解析结果集到相应的返回参数中。

解决方案 »

  1.   

    部分代码:(原来对结果集的处理是这样)只能处理一条结果
        ret = dbrpcexec(m_pProc);    if (SUCCEED != ret)
        {
            delete pMsgAck;        DoExecuteUserProcAck(pMsg, E_SQLSERVER_EXECUTE_FAIL);
            // Im00810004 = {0x0081, 0x00810004, "DBLIB OBJECT StoreProcedure execute fail. 
            //      DBSOURCE %s, StoreProcedure %s.\n"};
            CString Info;
            Info.Format(Im00810004.szDescTemplate, m_pDBSource->GetDbAlias(), ProcedureName);
            Information(Im00810004.wCategory, Im00810004.dwEventID, Info.GetLength(), 0, 
                (LPCTSTR)Info, NULL);        OnError();
            return;
        }    ret = dbsqlok(m_pProc);    if (SUCCEED != ret)
        {
            delete pMsgAck;        DoExecuteUserProcAck(pMsg, E_SQLSERVER_SQLOK_FAIL);
            // Im00810005 = {0x0081, 0x00810005, "DBLIB OBJECT StoreProcedure sqlok fail. 
            //      DBSOURCE %s, StoreProcedure %s\n"};
            CString Info;
            Info.Format(Im00810005.szDescTemplate, m_pDBSource->GetDbAlias(), ProcedureName);
            Information(Im00810005.wCategory, Im00810005.dwEventID, Info.GetLength(), 0, 
                (LPCTSTR)Info, NULL);        OnError();
            return;
        }    while(1)
        {
            ret = dbresults(m_pProc);        if (FAIL == ret)
            {
                delete pMsgAck;
                DoExecuteUserProcAck(pMsg, E_SQLSERVER_RESULT_FAIL);
                // Im00810006 = {0x0081, 0x00810006, "DBLIB OBJECT StoreProcedure result fail. 
                //      DBSOURCE %s, StoreProcedure %s.\n"};
                CString Info;
                Info.Format(Im00810006.szDescTemplate, m_pDBSource->GetDbAlias(), ProcedureName);
                Information(Im00810006.wCategory, Im00810006.dwEventID, Info.GetLength(), 0, 
                    (LPCTSTR)Info, NULL);            OnError();
                return;
            }        if (NO_MORE_RESULTS == ret)
                break;
            
            if (SUCCEED == ret)
            {
                // Even if dbrows returns FAIL, you must still process the results 
                // by calling dbnextrow until it returns NO_MORE_ROWS.
                dbrows(m_pProc);
                while (1)
                {
                    ret = dbnextrow(m_pProc);
                    if ((NO_MORE_ROWS == ret) || (FAIL == ret))
                        break;
                }
            }
        }    //pValue = (char*)pParams + pMsg->ParamNum * sizeof(PARAM_STRUCT);
        pRetValue = (char*)pRetParams + iMsgAckRetParamNum * sizeof(PARAM_STRUCT);
        int iColNo = 1;
        iMsgAckDataSize = 0;    memcpy(pMsgAck, pMsg, sizeof(MSG_DBPROXY_EXECUTE_USER_PROC_ACK));
        pMsgAck->lCommandID = DBPROXY_EXECUTE_USER_PROC_ACK;
        pMsgAck->lCommandStatus = E_SUCCESS;    if (dbhasretstat(m_pProc))
        {
            pMsgAck->ParamNum = iMsgAckRetParamNum;        for (int i = 0; i < iMsgAckRetParamNum; i++)
            {
                switch(pRetParams[i].DataType)
                {
                case D_CHAR:
                case D_VARCHAR:
                    {
                    memset(pRetValue, 0, pRetParams[i].MaxLen);
                    int iRetLen = dbretlen(m_pProc, iColNo);
                    if (iRetLen < 0)    // iColNo 非法
                    {
                        pRetParams[i].DataLen = 0;
                        break;
                    }
                    if (iRetLen > pRetParams[i].MaxLen-1)
                        iRetLen = pRetParams[i].MaxLen-1;                strncpy(pRetValue, (const char*)dbretdata(m_pProc, iColNo), iRetLen);
                    CutBlank(pRetValue);                pRetParams[i].DataLen = strlen(pRetValue) + 1;        // 包括NULL字符
                    break;
                    }            case D_TEXT:
                    {
                    memset(pRetValue, 0, pRetParams[i].MaxLen);
                    int iRetLen = dbretlen(m_pProc, iColNo);
                    if (iRetLen < 0)    // iColNo 非法
                    {
                        pRetParams[i].DataLen = 0;
                        break;
                    }
                    if (iRetLen > pRetParams[i].MaxLen-1)
                        iRetLen = pRetParams[i].MaxLen-1;                strncpy(pRetValue, (const char*)dbretdata(m_pProc, iColNo), iRetLen);
                    pRetParams[i].DataLen = strlen(pRetValue) + 1;        // 包括NULL字符                break;
                    }            case D_DATETIME:
                    memset(pRetValue, 0, pRetParams[i].MaxLen);
                    if (dbretlen(m_pProc, iColNo) > 0)
    {
    memcpy(pRetValue, dbretdata(m_pProc, iColNo), dbretlen(m_pProc, iColNo));
    mktotime(m_pProc, pRetValue, NULL, pRetValue);
                        pRetParams[i].DataLen = pRetParams[i].MaxLen;
    }
                    else
                        pRetParams[i].DataLen = 0;
                    break;            case D_BINARY:
                case D_VARBINARY:
                    {
                    int itmpRetLen = dbretlen(m_pProc, iColNo);
                    if ( itmpRetLen > 0)
                    {
                        memcpy(pRetValue, dbretdata(m_pProc, iColNo), itmpRetLen);
                        pRetParams[i].DataLen = itmpRetLen;
    }
                    else
                        pRetParams[i].DataLen = 0;
                    }
                    break;            default:
                    if (dbretlen(m_pProc, iColNo) > 0)
                    {
                        memcpy(pRetValue, dbretdata(m_pProc, iColNo), dbretlen(m_pProc, iColNo));
                        pRetParams[i].DataLen = pRetParams[i].MaxLen;
    }
                    else
                        pRetParams[i].DataLen = 0;
                }            pRetValue += pRetParams[i].DataLen;
                iMsgAckDataSize += pRetParams[i].DataLen;            iColNo++;
            }
        }
        else
        {
            pMsgAck->ParamNum = 0;
        }
        pMsgAck->lMessageLength = sizeof(MSG_DBPROXY_EXECUTE_USER_PROC_ACK) + 
            pMsgAck->ParamNum * sizeof(PARAM_STRUCT) + iMsgAckDataSize;    theApp.SendMessageToApplication((HANDLE)pMsgAck->lSenderHandle, pMsgAck->SendTaskID, pMsgAck, 
            pMsgAck->lMessageLength);    dbcancel(m_pProc);