long lDataSize=Mycs.m_pRecordset->GetFields()->GetItem("photo")->ActualSize;
//这里lDataSize的值是13457
if (lDataSize>0)
{
_variant_t varBLOB = Mycs.m_pRecordset->GetFields()->GetItem("photo")->GetChunk(lDataSize);
if(varBLOB.vt == (VT_ARRAY | VT_UI1))
{
char *pBuffer=new char[lDataSize+1];
if (!pBuffer)
{
::MessageBox(NULL,"读取数据出错,操作即将终止!","警告",MB_ICONWARNING);
Mycs.m_pRecordset->Close();
Mycs.m_pConnection->Close();
return;
}

char *pBuf = NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
//这里pBuf的长度是4,怎么回事?按道理应该等于lDataSize的
memcpy(pBuffer,pBuf,lDataSize);
SafeArrayUnaccessData (varBLOB.parray);

解决方案 »

  1.   

    指针在32位机器上占用4个byte.
      

  2.   

    不是啊
    sizeof等于4
    但是我是用的strlen不应该等于4
      

  3.   

    别的字段读取都正确
    但是这个photo字段IMAGE类型读取错误
    我知道
    sizeof(pBuffer)==4
    但是我用的strlen(pBuffer)
    而且我用MessageBox(pBuffer)看了
    显示的也是四个字符
      

  4.   

    BLOB字段大小超过32767需要分段处理,你应该做个循环来判断
      

  5.   

    char some[20];
    some[0]=0x30;
    some[4]=0;
    int iiiu=strlen(some);
    some[4]=0x30;
    some[5]=0;
    iiiu=strlen(some);
    strlen()碰到0(NULL)字符就认为是字符串结束了.而image就long binary字段,可以含有任何字符可能刚好是第5个byte是0;
    以前你给分都是200分忽然给80分以为你没分了哈...
      

  6.   

    如果是bmp,则第6个byte刚好是00.
    我的读doc第9个byte是00.
    blob不一定非得32767就分段处理吧.我用vc处理过500k的doc.pb处理过2m的dat.好像没出什么错...
      

  7.   

    ZHENG017(风中王子):
    是JPG,我再去试一试
      

  8.   

    问题已经解决
    顺便再问个问题我把JPG图片往数据库写
    一张13.3K的图片数据正常
    当图片达到30K的时候就出错了TNND,估计又是指针出错
    不会真的是要分段处理吧?
      

  9.   

    jpg?刚好是第5个byte是0.哈哈.在vc中以binary方式打开jpg.