按照以下来自MSDN的代码访问sql server的image类型字段没有问题,
但是访问Oracle的BLOB和CLOB类型字段时在GetData()函数总是返回该列
为NULL,实际上是有值的,用的oledb provider为OraOLEDB.Oracle,
是安装oracle 9i时装上的,我没有其他版本的Oracle及其oledb provider,
无法测试其他版本有没有这个问题。请教各位达人,究竟要怎么样才能
返回BLOB字段的值呀!另外,类似代码插入和更新BLOB字段没有问题。    DBOBJECT ObjectStruct;
    ObjectStruct.dwFlags = STGM_READ;
    ObjectStruct.iid     = IID_ISequentialStream;    struct BLOBDATA
    {
        DBSTATUS            dwStatus;   
        DWORD               dwLength; 
        ISequentialStream*  pISeqStream;
    };    
    hr = pIAccessor->CreateAccessor(DBACCESSOR_ROWDATA,
                                    cBindings,
                                    rgBindings, 
                                    sizeof(BLOBDATA),
                                    &hAccessor,
                                    rgBindStatus);
    if (FAILED(hr))
    {
        printf("Failed to create an accessor.\n");
        //Release any references and return.
        goto Exit;
    } //end if     //Now get the first row.
    hr = pIRowsetChange->QueryInterface(IID_IRowset, 
                                        (void **)&pIRowset);
    if (FAILED(hr))
    {
        printf("Failed to get IRowset interface.\n");
        //Release any references and return.
        goto Exit;
    } //end if    hr = pIRowset->GetNextRows(NULL, 
                               0, 
                               1, 
                               &cRowsObtained, 
                               &rghRows);    hr = pIRowset->GetData(rghRows[0], 
                           hAccessor, 
                           &BLOBGetData);    //Verify the retrieved data, only if data is not null.
    if (BLOBGetData.dwStatus == DBSTATUS_S_ISNULL)
    {
        //Process null data
        printf("Provider returned a null value.\n");
    } else if(BLOBGetData.dwStatus == DBSTATUS_S_OK) 
      //Provider returned a nonNULL value
    {
        BLOBGetData.pISeqStream->Read(
                                    pBuffer, 
                                    cBytes, 
                                    &cBytesRead);
        if(memcmp(pBuffer, pReadData, cBytes) != 0)
        {
            //cleanup 
         }        SAFE_RELEASE(BLOBGetData.pISeqStream);
    }

解决方案 »

  1.   

    你参考以下这段程序:
    CMyImageSet  * pMyImageSet = new CMyImageSet; try
    {
    pMyImageSet->Open();
    }
    catch(CException* pE)
    {
    pE->ReportError();
    pE->Delete();
    delete pMyImageSet;
    return FALSE;
    }
    if (pMyImageSet->GetRecordCount()<=0)
    {
    return FALSE;
    } m_strFileName = _T("Temp"); //°&Ntilde;&Iacute;&frac14;&ETH;&Icirc;&ETH;&Aring;&Iuml;&cent;&para;&Aacute;&Egrave;&euml;&micro;&frac12;&Icirc;&Auml;&frac14;&thorn;&Ouml;&ETH;
    CFile outFile(m_strFileName, CFile::modeCreate | CFile::modeWrite);
    LPSTR buffer = (LPSTR)GlobalLock(pMyImageSet->m_Image.m_hData);
    outFile.WriteHuge(buffer,pMyImageSet->m_Image.m_dwDataLength);
    GlobalUnlock(pMyImageSet->m_Image.m_hData); outFile.Close();
    GlobalUnlock(pMyImageSet->m_Image.m_hData); delete pMyImageSet; if (m_ListImage.Load(m_strFileName) == FALSE)
    {
    return FALSE;
    } CRect ViewRect; m_ImageData = m_ListImage.GetObjectData(); m_ImageWidth = m_ImageData.GetWidth();
    m_ImageHeight = m_ImageData.GetHeight(); GetWindowRect(&ViewRect); m_w = (int)m_ImageWidth;
    m_h = (int)m_ImageHeight;
    m_x = 0;
    m_y = 0; CClientDC dc(this); m_ImageData.Draw( dc, m_x, m_y, m_w, m_h, 0, 0, m_ImageWidth, m_ImageHeight);
      

  2.   

    石头大哥,你的例子是用的ADO吗?我只能用oledb呀!而且我的程序连sqlserver没问题的,就是oracle不行。感谢你的回复!!
      

  3.   

    我找到答案了,rgBindings的cbMaxLen不为0就可以的到可用的ISequentialStream接口,虽然返回的长度是错的,但可以用该接口循环读取直到所有字节的东西都读出来为止。Oracle果然够烂,sqlserver就会直接返回正确的长度。