ArcGIS的BLOB========>Access数据库的BLOB
技术思路:首先利用AE接口获取VARIANT类型的属性值,然后将这个值以文件流的方式写到一个路径下的文件中,然后再根据这个文件形成一个新的COleVariant对象
IMemoryBlobStream2Ptr iMBS;
iMBS.CreateInstance(CLSID_MemoryBlobStream);
IMemoryBlobStreamVariantPtr iMBSV = (IMemoryBlobStreamVariantPtr)iMBS;
iMBSV=varFieldValue.punkVal;(varFieldValue为利用AE接口获取的VARIANT变量)
IBlobStreamPtr bs;
bs=iMBSV;
bs->SaveToFile(g_strBLOBImport.AllocSysString());(以文件流的方式写入指定文件中)
STATSTG tag;
hr = bs->Stat(&tag, STATFLAG_DEFAULT);
unsigned long size;
bs->get_Size(&size);(获得文件流的大小)
CFile file;
CByteArray ba;
if ((file.Open(g_strBLOBImport, CFile::modeRead|CFile::typeBinary)) == NULL) (以二进制的方式打开指定文件)
return NULL;
else
{
for (int j=0; j<size; j++)
{
file.LockRange(j,1);
BYTE b;
file.Read(&b, 1);
ba.Add(b);
}
}
file.Close();
COleVariant* pVar2 = new COleVariant(ba);(形成新的COleVariant对象)
另外:1.ArcGIS生成的BLOB字段的数据对象VARIANT的类型,即VARIANT::vt,是VT_UNKNOWN,所以在导出时要设置回去
2.在数据库插入BLOB字段,不能用SetValue,而要用AppendChunk()
Access数据库的BLOB========>ArcGIS的BLOB
技术思路:首先将属性数据拷贝为BYTE类型的变量中,然后利用AE接口将该变量导入类型为IMemoryBlobStream2Ptr变量中,最后再创建VARIANT对象
unsigned long cBufLen = var.parray->rgsabound[0].cElements;
BYTE * ppBuf;
ppBuf = new BYTE[cBufLen];
if(ppBuf != NULL)
{
void* pArrayData;
SafeArrayAccessData(var.parray,&pArrayData);
memcpy(ppBuf, pArrayData, cBufLen);(拷贝数据)
SafeArrayUnaccessData(var.parray);
}
IMemoryBlobStream2Ptr iMBS;
iMBS.CreateInstance(CLSID_MemoryBlobStream);
iMBS->ImportFromMemory(ppBuf, cBufLen);(导入数据)
IMemoryBlobStreamVariantPtr iMBSV = (IMemoryBlobStreamVariantPtr)iMBS;
VARIANT TVar;
TVar.vt = VT_UNKNOWN;
TVar.punkVal = iMBSV;(生成新的VARIANT对象)
hr = pFeature->put_Value(i + 2, TVar); (插入数据)