同样的代码应用在ORACLE的BOLB字段上工作正常,用的是APPENDCHUNK、GETCHUNK方法实现的。但是在SYBASE数据库上总是只能读出4K,不知道是只存进去4K,还是只读出来4K怎么解决?请各位指点迷津

解决方案 »

  1.   

    BOOL CADODataSet::AppendChunk(FieldPtr pField, const unsigned char* lpData, UINT nBytes)
    {
    SAFEARRAY FAR *pSafeArray = NULL;
    SAFEARRAYBOUND rgsabound[1];
    HRESULT hr; try
    {
    rgsabound[0].lLbound = 0;
    rgsabound[0].cElements = nBytes;
    pSafeArray = SafeArrayCreate(VT_UI1, 1, rgsabound); for (long i = 0; i < (long)nBytes; i++)
    {
    UCHAR &chData = ((UCHAR*)lpData)[i];
    HRESULT hr = SafeArrayPutElement(pSafeArray, &i, &chData);
    if (FAILED(hr)) return FALSE;
    } _variant_t varChunk;
    varChunk.vt = VT_ARRAY | VT_UI1;
    varChunk.parray = pSafeArray; hr = pField->AppendChunk(varChunk); return ( hr == S_OK);
    }
    catch (_com_error &e)
    {
    TRACE(_T("Warning: AppendChunk 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
    return FALSE;
    }}
    BOOL CADODataSet::GetChunk(FieldPtr pField, basic_string<unsigned char>& lpData)
    {
    ASSERT(pField != NULL);
    // ASSERT(lpData != NULL);
    basic_string<unsigned char> ucBuffer; const UINT BLOCKSIZE = 4096;
    long FileLen = 0;
    long ulElements; UCHAR chData;
    long index = 0; FileLen = pField->ActualSize; while (index < FileLen)

    try
    {
    _variant_t varChunk;
    varChunk = pField->GetChunk(BLOCKSIZE); if (varChunk.vt != (VT_ARRAY | VT_UI1))
    return FALSE; ulElements = varChunk.parray->rgsabound[0].cElements;            for (long i = 0; i < (long)ulElements; i++)
                {
                    if (SUCCEEDED( SafeArrayGetElement(varChunk.parray, &i, &chData) ))
                    {
    //((UCHAR*)lpData)[index] = chData;
    ucBuffer += chData;
                        index++;
                    }
                    else
    {
                        break;
    }
                }
    }
    catch (_com_error e)
    {
    TRACE(_T("Warning: GetChunk 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
    return FALSE;
    } } lpData = ucBuffer; return TRUE;
    }现在的主要实现代码