使用如下代码在本地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);
}