创建ITable不能更新记录的问题

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值