我用MFC连接数据库,批量读取数据库中表的数据:
在读取字符串数据类型的字段时用如下代码:
void** m_ppvData;    // allocate dynamically to nColumns later
void** m_ppvLengths; // allocate dynamically to nColumns laterRFX_Text_Bulk(pFX, "FieldName",
             (LPSTR*)&m_ppvData[1],
             (long**)&m_ppvLengths[1],
             MAX_TEXT_LEN);
能够读取数据出来,但是请教大家取出来的数据中,m_ppvData[nNum]这个指针指向的数据内容是怎样放的呢?
知道是多条字符串字段记录的,如果取出数据这样来取
CString* rgItemTexts;
CString m_pstrItemText[10];rgItemTexts = (char*)m_ppvData[1];
for(int i = 0;i < 10;i++)
{
   m_pstrItemText[i] = rgItemTexts[i];
}
结果只能取到m_pstrItemText[0]的值,后面就取不到。
请问是为什么?

解决方案 »

  1.   

    void MultiRowSet::DoBulkFieldExchange( CFieldExchange* pFX )
    {
       pFX->SetFieldType( CFieldExchange::outputColumn );
       RFX_Long_Bulk( pFX, _T( "[colRecID]" ),
                      &m_rgID, &m_rgIDLenghts );
       RFX_Text_Bulk( pFX, _T( "[colName]" ),
                      &m_rgName, &m_rgNameLengths, 30 );   pFX->SetFieldType( CFieldExchange::inputParam );
       RFX_Text( pFX, "NameParam", m_strNameParam );
    }
    http://msdn2.microsoft.com/en-us/library/77dcbckz(VS.80).aspx
      

  2.   

    像一楼说的那样,
    只是在去数据时:
    rgItemTexts   =   (char*)m_ppvData[1]; 
    for(int   i   =   0;i   <   10;i++) 

          m_pstrItemText[i]   =   rgItemTexts[i]; 

    如果前面调用DoBulkFieldExchange( CFieldExchange* pFX )时候这样写的语句:
    RFX_Text_Bulk(pFX,   "FieldName ", 
                              (LPSTR*)&m_ppvData[1], 
                              (long**)&m_ppvLengths[1], 
                              MAX_TEXT_LEN); 那么改成这样:
    char*   rgItemTexts; 
    CString   m_pstrItemText[10]; rgItemTexts   =   (char*)m_ppvData[1]; 
    for(int   i   =   0;i   <   10;i++) 

          m_pstrItemText[i]   =   rgItemTexts + MAX_TEXT_LEN * i; 

    参考MFC源代码如下:
    case CFieldExchange::AllocMultiRowBuffer:
    {
    // The buffer pointer better be initialized to NULL
    // or cleanup in exceptional cases mail fail
    ASSERT(*prgStrVals == NULL);
    ASSERT(*prgLengths == NULL); int nRowsetSize = pFX->m_prs->GetRowsetSize(); // Allocate buffers to hold data and length
    *prgStrVals = new CharType[nRowsetSize * nMaxLength]; // Make sure bulk-row fetching works for Unicode
    *prgLengths = new LONG_PTR[nRowsetSize];
    }
    break;