遇到一个问题请教一下大家:
我要取得一个IFeatrue的第n列的数据,我用如下方式获取:
VARIANT varValTest;
ipFeature->get_Value(Index,&varValTest); //其中Index是int型数值
但是返回的varValTest.vt是VT_EMPTY
我用如下方式(函数名称没有校对):
VARIANT varValTest;
ipFeature->getTable(&iptable);
long loid=0;
ipFeatrue->getLOID(&loid);
IRowPtr iprow;
iptable->getrow(loid,&iprow);
iprow->getvalue(Index,&varValTest);
就可以返回正确值。
请教一下第一种方式是不是有问题,问题是不是与数值有关系,怎么能解决这个问题?因为第二种方式在大数据量的时候影响效率,因此最好能用第一种方式解决。
我要取得一个IFeatrue的第n列的数据,我用如下方式获取:
VARIANT varValTest;
ipFeature->get_Value(Index,&varValTest); //其中Index是int型数值
但是返回的varValTest.vt是VT_EMPTY
我用如下方式(函数名称没有校对):
VARIANT varValTest;
ipFeature->getTable(&iptable);
long loid=0;
ipFeatrue->getLOID(&loid);
IRowPtr iprow;
iptable->getrow(loid,&iprow);
iprow->getvalue(Index,&varValTest);
就可以返回正确值。
请教一下第一种方式是不是有问题,问题是不是与数值有关系,怎么能解决这个问题?因为第二种方式在大数据量的时候影响效率,因此最好能用第一种方式解决。
谢谢!!!
==========================================
用VC测试了,没有问题的
LONG index=2;
IFeaturePtr pFeature;
pFeatureClass->GetFeature(index,&pFeature);
VARIANT var;
index=5;
pFeature->get_Value(index,&var);
读取IFeature字段信息的代码
IEnvelopePtr ipEnv(m_MapControl.TrackRectangle()); ISelectionEnvironmentPtr ipSeletionEnv(CLSID_SelectionEnvironment); ipSeletionEnv->put_SearchTolerance(2); ipSeletionEnv->put_CombinationMethod(esriSelectionResultNew); m_ipMap->SelectByShape(ipEnv,ipSeletionEnv,false); iActiveView->PartialRefresh(esriViewGeoSelection,NULL,NULL); ISelectionPtr ipSelection; m_ipMap->get_FeatureSelection(&ipSelection); long selcount; m_ipMap->get_SelectionCount(&selcount);//获取选择要素的个数 IEnumFeaturePtr ipEnumFeature(ipSelection); ipEnumFeature->Reset(); IFeaturePtr ipFeature; ipEnumFeature->Next(&ipFeature); while(!(ipFeature==0)) { BSTR LayerName; IObjectClassPtr pObjectClass; ipFeature->get_Class(&pObjectClass); pObjectClass->get_AliasName(&LayerName);//获得要素的对象名称 CString rootname=LayerName; IFieldsPtr pFields; IFieldPtr pField; long Index;//字段索引 ipFeature->get_Fields(&pFields); const CString fieldname="MISNAME";//定义要查询的字段名 pFields->FindField(_bstr_t(fieldname),&Index); //得到具体的字段信息 CComVariant varValTest; ipFeature->get_Value(Index,&varValTest); 、、为什么这样取值一直是空的呢? CString fieldvalue; fieldvalue=varValTest.bstrVal; ipEnumFeature->Next(&ipFeature); } 但是这样就可以获取信息了,速度有点慢啊,能不能用前面的方法解决啊? ipFeature->get_Class(&pObjectClass); pObjectClass->get_AliasName(&LayerName);//获得要素的对象名称 ipFeature->get_OID(&lOid); //重新通过IFeatureClas 得到这个要素,因为ipFeature没有返回所有的字段 //他只返回了ID ipFeatureClass=pObjectClass; ITablePtr pTable; IRowPtr pRow; pTable=ipFeatureClass; pTable->GetRow(lOid,&pRow); pRow->get_Value(Index,&varValTest); |