使用如下代码在本地FileGDB中创建一个表:
HRESULT hr; IFieldsPtr ipFields(CLSID_Fields); IFieldsEditPtr ipFieldsEdit(ipFields); { IFieldPtr ipFieldPI(CLSID_Field); IFieldEditPtr ipFieldEditPI(ipFieldPI); ipFieldEditPI->put_Name(_bstr_t(g_strMsgFieldProjectID)); ipFieldEditPI->put_Type(esriFieldTypeString); ipFieldEditPI->put_Length(255); ipFieldsEdit->AddField(ipFieldPI); } { IFieldPtr ipFieldFC(CLSID_Field); IFieldEditPtr ipFieldEditFC(ipFieldFC); ipFieldEditFC->put_Name(_bstr_t(g_strMsgFieldFeatureClass)); ipFieldEditFC->put_Type(esriFieldTypeString); ipFieldEditFC->put_Length(64); ipFieldEditFC->put_Editable(VARIANT_TRUE); ipFieldsEdit->AddField(ipFieldFC); } { IFieldPtr ipFieldEC(CLSID_Field); IFieldEditPtr ipFieldEditEC(ipFieldEC); ipFieldEditEC->put_Name(_bstr_t(g_strMsgFieldExportCount)); ipFieldEditEC->put_Type(esriFieldTypeInteger); ipFieldEditEC->put_Length(16); ipFieldEditEC->put_Editable(VARIANT_TRUE); ipFieldsEdit->AddField(ipFieldEC); } { IFieldPtr ipFieldIC(CLSID_Field); IFieldEditPtr ipFieldEditIC(ipFieldIC); ipFieldEditIC->put_Name(_bstr_t(g_strMsgFieldImportCount)); ipFieldEditIC->put_Type(esriFieldTypeInteger); ipFieldEditIC->put_Length(16); _variant_t vtValue; vtValue.vt = VT_INT; vtValue.intVal = 0; ipFieldEditIC->put_DefaultValue(vtValue); ipFieldsEdit->AddField(ipFieldIC); } hr = ipFWS->CreateTable(_bstr_t(g_strMsgTableName), ipFields, NULL, NULL, _T(""), &ipTable); if (FAILED(hr) || NULL == ipTable) { return FALSE; } return TRUE;发现无法更新:
BOOL CCommonFunctions::InsertImportedCount(IWorkspacePtr& ipWS, std::map<CString, long>& mapNameCount) { if (nullptr == ipWS) { return FALSE; } if (mapNameCount.size() == 0) { return TRUE; } IFeatureWorkspacePtr ipFWS = ipWS; ITablePtr ipTable = NULL; HRESULT hr = ipFWS->OpenTable(_bstr_t(g_strMsgTableName), &ipTable); if (FAILED(hr) || NULL == ipTable) { return FALSE; } long lIndexFeatureClass = -1; long lIndexImportCount = -1; hr = ipTable->FindField(_bstr_t(g_strMsgFieldFeatureClass), &lIndexFeatureClass); hr = ipTable->FindField(_bstr_t(g_strMsgFieldImportCount), &lIndexImportCount); if (0 > lIndexFeatureClass || 0 > lIndexImportCount) { return FALSE; } esriICursorPtr ipCursor = NULL; hr = ipTable->Update(NULL, VARIANT_FALSE, &ipCursor); _variant_t vtValue; CString strName = _T(""); esriIRowPtr ipRow = NULL; while (S_OK == ipCursor->NextRow(&ipRow) && NULL != ipRow) { vtValue.vt = VT_EMPTY; hr = ipRow->get_Value(lIndexFeatureClass, &vtValue); strName = VARIANTtoString(vtValue); if (strName.IsEmpty()) { continue; } vtValue.vt = VT_UI4; vtValue.lVal = mapNameCount[strName]; if (vtValue.lVal < 0) { continue; } hr = ipRow->put_Value(lIndexImportCount, vtValue.lVal); if (FAILED(hr)) { continue; } hr = ipCursor->UpdateRow(ipRow); //执行出错,提示参数无效 if (FAILED(hr)) { continue; } } return TRUE; }在ArcMap中打开也无法编辑。
刚开始以为是字段属性问题,于是进行如下设置(创建字段时指定其Editable属性为真):
ipFieldEditIC->put_Editable(VARIANT_TRUE);发现还是不行。
最后,解决方案是添加OID字段,如下:
{ IFieldPtr ipFieldOID(CLSID_Field); IFieldEditPtr ipFieldEditOID(ipFieldOID); ipFieldEditOID->put_Name(_bstr_t(_T("OID"))); ipFieldEditOID->put_Type(esriFieldTypeOID); ipFieldsEdit->AddField(ipFieldOID); }