前提数据库中有数据,我用PB可以读出图像并显示
但是在VC中
本人按照oo40库中给的例子在读取时
odyn.GetFieldValue("photo",&oblob);   
//这里报错
oblob.GetSize()
//---
按说根据orcale.h中定义GetFieldValue可以读取OBlob类型的呀
我查了网上都说用GetChunk该怎么做?

解决方案 »

  1.   

    GetChunk是ADO函数..关于这方面的使用方法请参考如下内容:\
    http://www.vckbase.com/document/viewdoc/?id=252
    http://www.vckbase.com/document/viewdoc/?id=719
      

  2.   


    BOOL CTcrADORecordset::GetChunk(FieldPtr pField, CString& strValue)
    {
    CString str = _T("");
    long lngSize, lngOffSet = 0;
    _variant_t varChunk; lngSize = pField->ActualSize;

    str.Empty();
    while(lngOffSet < lngSize)

    try
    {
    varChunk = pField->GetChunk(ChunkSize);

    str += varChunk.bstrVal;
    lngOffSet += ChunkSize;
    }
    catch(_com_error &e)
    {
    dump_com_error(e);
    return FALSE;
    }
    } lngOffSet = 0;
    strValue = str;
    return TRUE;
    }
      

  3.   

    上一个是读大字符串的,这个是大文件的BOOL CTcrADORecordset::GetChunk(FieldPtr pField, LPVOID lpData)
    {
    long lngSize, lngOffSet = 0;
    _variant_t varChunk;    
    UCHAR chData;
    HRESULT hr;
    long lBytesCopied = 0; lngSize = pField->ActualSize;

    while(lngOffSet < lngSize)

    try
    {
    varChunk = pField->GetChunk(ChunkSize); //Copy the data only upto the Actual Size of Field.  
                for(long lIndex = 0; lIndex <= (ChunkSize - 1); lIndex++)
                {
                    hr= SafeArrayGetElement(varChunk.parray, &lIndex, &chData);
                    if(SUCCEEDED(hr))
                    {
                        //Take BYTE by BYTE and advance Memory Location
                        //hr = SafeArrayPutElement((SAFEARRAY FAR*)lpData, &lBytesCopied ,&chData); 
    ((UCHAR*)lpData)[lBytesCopied] = chData;
                        lBytesCopied++;
                    }
                    else
                        break;
                }
    lngOffSet += ChunkSize;
    }
    catch(_com_error &e)
    {
    dump_com_error(e);
    return FALSE;
    }
    } lngOffSet = 0;
    return TRUE;
    }
      

  4.   

    while(lngOffSet  < lngSize) 
    {  
    try 

    varChunk = pField-> GetChunk(ChunkSize); 这里读的时候不要用循环,直接读就可以了.. 用SafeArrayAccessData函数,如:
    long lDataSize = m_pRs->GetFields()->GetItem("pic")->ActualSize;
    if(lDataSize > 0)
    {
    _variant_t varBLOB;
    varBLOB = m_pRs->GetFields()->GetItem("pic")->GetChunk(lDataSize);
    if(varBLOB.vt == (VT_ARRAY | VT_UI1))
    {
    char *pBuf = NULL;
    SafeArrayAccessData(varBLOB.parray,(void **)&pBuf); DisplayBMP2(pBuf);//显示BMP字段图片
    SafeArrayUnaccessData(varBLOB.parray);
    }
    }
      

  5.   

    谢谢各位大大,ADO方式我知道,主要是程序底层是用OO4O方式连的,我想找OO4O方式ODynaset中提供
    oresult GetFieldValue(const char *fieldname, OBlob  *val) const;
    我取出后总是空