我通过如下方法来获取表中long型字段的内容,但是最终获得的数据却不完整,只有前面部分的内容被取出来了????_RecordsetPtr rs(__uuidof(Recordset));
rs->Open(.....);_variant_t vt = rs->Fields->GetItem("MyLongData")->Value;比如说如果MyLongData的内容为“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...”
通过上面的代码,vt中的数据却为“aaaaaaaaaaaaaaaaaaaaaa”有人遇到过这样的情况吗?

解决方案 »

  1.   

    不能直接类型转换,给你一段代码
    iType = vValue.vt;

    if (iType == (VT_ARRAY | VT_UI1))
    {
    m_lpData = new char[uLength];
    memset(m_lpData, 0, uLength);
    char* pBufTemp = NULL;
    SafeArrayAccessData(vValue.parray, (void **)&pBufTemp);
    for (int i = 0; i < uLength; i++)
    *(((char*)m_lpData)+i) = *(pBufTemp+i);
    SafeArrayUnaccessData (vValue.parray);
                      m_lpData就是你要的数据
    }
      

  2.   

    但是我的vt值为8(VT_BSTR),既不是VT_ARRAY也不是VT_UI1啊?
      

  3.   

    但是我的vt为8,既不是VT_ARRAY也不是VT_UI1啊?????
      

  4.   

    // LPVOID lpData; 缓冲区指针FieldPtr pField = rs->Fields->GetItem("MyLongData");long lngSize, lngOffSet = 0;
    _variant_t varChunk;    
    UCHAR chData;
    HRESULT hr;
    long lBytesCopied = 0;lngSize = pField->ActualSize;

    while(lngOffSet < lngSize)

        try
        {
            varChunk = pField->GetChunk(100);        //Copy the data only upto the Actual Size of Field.  
            for(long lIndex = 0; lIndex <= (100- 1); lIndex++)
            {
                hr= SafeArrayGetElement(varChunk.parray, &lIndex, &chData);
                if(SUCCEEDED(hr))
                {
                    ((UCHAR*)lpData)[lBytesCopied] = chData;
                    lBytesCopied++;
                }
                else
                    break;
                }
                lngOffSet += ChunkSize;
            }
        catch(_com_error &e)
        {
            dump_com_error(e);
        }
    }
      

  5.   

    还是不行!
    执行到varChunk = pField->GetChunk(100);后,通过跟踪,发现varChunk的vt仍为VT_BSTR
    所以在这样的情况下,访问varChunk.parray还有意义吗?
      

  6.   

    最终将LONG型字段改成CLOB类型解决了问题!而且获取方式跟一般的VARCHAR2字段一样。
      

  7.   

    CHAR szTemp[256];
    WideCharToMultiBytes(CP_CAP,0,rs->Fields->GetItem("MyLongData")->Value.bstrVal,-1,szTemp,256, NULL,NULL);其中256可以改为你的字段的长度。