前言
本文针对gdb中表的数据类型如下,本文不适合更改要素属性表的场景。请在ArcGIS中查看数据源的属性信息。本文使用数据属性信息如下:
Data Type:Standalone Table
Table Type:File Geodatabase Table
Has Object-ID Field: Yes
1、读取gdb数据库中的表文件
pTable这个变量,在本文中不同功能模块都会使用,在本模块定义并进行了赋值,后续模块将直接使用。
using ESRI.ArcGIS.Geodatabase;
private ITable pTable = null;
//workspace是创建的gdb工作空间
private ITable GetInfoTable(IWorkspace workspace)
{
IEnumDataset pEnumDataset = workspace.get_Datasets(esriDatasetType.esriDTTable);
IDataset dataset = pEnumDataset.Next();
while (dataset != null)
{
//FileGeoDatabase_Name为gdb数据库中的表名
if (dataset.Name == "FileGeodatabaseTable_Name")
{
return dataset as ITable;
}
dataset = pEnumDataset.Next();
}
return null;
}
//ws为gdb工作空间,请读者自行查阅创建方法
pTable = GetInfoTable(ws);
2、更新表数据
下面这段代码用于更新指定行的数据,通过字典储存需要更新的信息,并循环字典中的内容进行指定行的指定数据更新。
dicColumnindex_newValue:
key为columnIndex,即表文件的列序数(从零开始计数)。
value为newValue,即需要进行更新的数据值。
//这里假设更新表的相关数据存在字典里
private Dictionary<int, string> dicColumnindex_newValue;
//实例化字典,否则报错
dicColumnindex_newValue = new Dictionary<int, string>();
//向字典中添加数据
//dicColumnindex_newValue.Add(key,value);
private void updateInfo()
{
// 创建查询过滤器
IQueryFilter queryFilter = new QueryFilter();
// 设置过滤条件,这里设置的是查询条件是特定ObjectID的数据
queryFilter.WhereClause = "ObjectID = " + objId;
ICursor cursor = pTable.Update(queryFilter, true);
IRow pRow = cursor.NextRow();
for(int i = 0; i < dicColumnindex_newValue.Count; i++)
{
string newValue = "";
//通过键获取值
dicColumnindex_newValue.TryGetValue(columnIndex, out newValue);
pRow.set_Value(columnIndex, newValue);
cursor.UpdateRow(pRow);
pRow.Store();
//下面这句会自动将更新数据覆盖gdb中的表数据
cursor.Flush();
}
}
3、插入一行新数据
IRowBuffer rowBuffer = pTable.CreateRowBuffer();
//true表示使用缓存(官方说法:useBuffering),false则不使用。
ICursor insertCursor = pTable.Insert(true);
for (int i = 0; i < dicColumnindex_newValue.Count; i++)
{
string value = "";
//该字典定义详见 2、更新表数据 中有说明
dicColumnindex_newValue.TryGetValue(columnIndex, out Value);
rowBuffer.set_Value(columnIndex, value);
}
insertCursor.InsertRow(rowBuffer);
insertCursor.Flush();
4、删除整行数据
//此处以删除指定objectid值的行为例
IQueryFilter queryFilter = new QueryFilterClass();
//objectidValue 为设置的特定值,即删除objectid为objectidValue的整行
//通过设置whereClause也可以选择多行进行删除
queryFilter.WhereClause = "OBJECTID =" + objectidValue;
pTable.DeleteSearchedRows(queryFilter);