某个有20万数据的图层,更新一个字段,将DLMC 内的值“水田”修改为“田地”,其中“DLMC='水田'”的数据有1.5万。做如下测试
一、IWorkspace.ExecuteSQL
在更新大数据量时挺快,但不支持空间筛选。某些情況下可能不支持IWorkspace.ExecuteSQL这个方法,执行前最好先使用IWorkspaceProperty判断是否支持ExecuteSQL方法。如MDB、GDB、database等支持,而ShapeFile, CAD, Coverage的workspace就不支持这个方法。
private static void UpdateByWorkspace(IFeatureClass pFeatureClass)
{
IDataset pDataset = pFeatureClass as IDataset;
IWorkspace pWorkspace = pDataset.Workspace;
IWorkspaceProperties pWorkspaceProperties = pWorkspace as IWorkspaceProperties;
IWorkspaceProperty pWorkspaceProperty = pWorkspaceProperties.get_Property(esriWorkspacePropertyGroupType.esriWorkspacePropertyGroup, 0);
if (pWorkspaceProperty.IsSupported)
pDataset.Workspace.ExecuteSQL($"UPDATE {pDataset.Name} set {pDataset.Name}.DLMC='田地' where {pDataset.Name}.DLMC='水田'");
}
耗时:2852ms
二、ITable.UpdateSearchedRows
转成ITable后更新
public static void UpdateByTable(IFeatureClass pFeatureClass)
{
ISpatialFilter pSpatialFilter = new SpatialFilterClass();
pSpatialFilter.WhereClause = "DLMC = '水田'"; //更新条件
int idx = pFeatureClass.FindField("DLMC"); //待更新字段索引
ITable pTable = pFeatureClass as ITable;
IRowBuffer rowBuffer = pTable.CreateRowBuffer();
rowBuffer.set_Value(idx, "田地");
(pFeatureClass as ITable).UpdateSearchedRows(pSpatialFilter, rowBuffer);
}
耗时:5288ms
三、IFeatureCursor.UpdateFeature
游标方式更新。
public static void UpdateByCursor(IFeatureClass pFeatureClass)
{
ISpatialFilter pSpatialFilter = new SpatialFilterClass();
pSpatialFilter.WhereClause = "DLMC = '水田'"; //更新条件
int idx = pFeatureClass.FindField("DLMC"); //待更新字段索引
IFeatureCursor pFeatureCursor = pFeatureClass.Update(pSpatialFilter, true);
IFeature pFeature = null;
while ((pFeature = pFeatureCursor.NextFeature()) != null)
{
pFeature.Value[idx] = "田地"; //将原本的城市更新为A市
pFeatureCursor.UpdateFeature(pFeature);
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor);
}
耗时:5283ms
四、IFeature.Store
适用于更新单个要素,批量更新速度很慢。
public static void UpdateByFeature(IFeatureClass pFeatureClass)
{
ISpatialFilter pSpatialFilter = new SpatialFilterClass();
pSpatialFilter.WhereClause = "DLMC = '水田'"; //更新条件
int idx = pFeatureClass.FindField("DLMC"); //待更新字段索引
IFeatureCursor pFeatureCursor = pFeatureClass.Update(pSpatialFilter, true);
IFeature pFeature = null;
while ((pFeature = pFeatureCursor.NextFeature()) != null)
{
pFeature.Value[idx] = "田地"; //将原本的城市更新为A市
pFeature.Store();
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor);
//更新单个要素
IFeature feature = pFeatureClass.GetFeature(1); // Get a known feature using its Object ID.
feature.set_Value(idx, "My Value");
feature.Store(); // Store the changes.
}
批量耗时:47608ms