Access中的图像字段使用二进制存储(OLE对象); 存储时,获取图像的二进制信息,写入Access,但插入Access表中的字段类型为_variant_t,所以需要转换,如下; _variant_t ImgBufferToVar(BYTE* pBuffer,const int& nLen) { _variant_t varPic;//该对象用于存放位图信息 varPic.vt = VT_NULL; BYTE* buff = pBuffer; SAFEARRAY *safeArray;//定义一个SAFEARRAY结构对象 SAFEARRAYBOUND rgsabound[1];//此结构体用来定义SAFEARRAY的边界 if(buff)//判断位图文件是否为空 { //int nLen = sizeof(buff)/sizeof(char*); rgsabound[0].lLbound=0;//定义下界 rgsabound[0].cElements=nLen;//定义上限 safeArray=SafeArrayCreate(VT_UI1,1,rgsabound);// 使用SafeArrayCreate在堆上创建一维数组 for(long i=0;i<(long)nLen;i++) { SafeArrayPutElement(safeArray,&i,buff++);//传值 } varPic.vt=VT_ARRAY|VT_UI1;//把值给VARIANT对象 varPic.parray=safeArray; //把值给VARIANT对象 } return varPic; } 然后———— pRecordset->GetFields()->GetItem(varField)->AppendChunk(varValue); 这样就完成了写入; 如何读取Access表中的图像字段,原理也是一样的: 首先获取存储在表中图像的二进制信息,然后把二进制信息写入图像文件(比如bmp),就得到图像了; BYTE* CLiboProcessImage::VarToImgBuffer(const _variant_t& var,const int& nBufferLen) { BYTE* pBuffer = NULL; if(var.vt==(VT_ARRAY|VT_UI1)) { pBuffer = new BYTE[nBufferLen + 1]; BYTE *buff; SafeArrayAccessData(var.parray,(void**)&buff); //把位图数据放到buff中去 memcpy(pBuffer,buff,nBufferLen); //把位图数据放到pBuff中 BITMAPFILEHEADER *pbh = (BITMAPFILEHEADER *)pBuffer; SafeArrayUnaccessData(var.parray); //释放 } return pBuffer; } 过程如下: 先获取字段数据(_variant_t类型),然后通过上面函数转为Byte*类型,就ok了;nBufferLen通过 nBufferLen = pRecordset->GetFields()->GetItem(L"图像列名")->ActualSize;
|
|