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); (插入数据)

 

posted on 2008-10-09 19:50  章力博  阅读(2152)  评论(0编辑  收藏  举报