对于关系数据库,ArcEngine定义了几种查询接口:
1,常规的ITable、IFeatureClass接口
这是我们最常使用的,完成同一个表内的数据查询、更新操作
//IFeaturWorkspace pFWork;
ITable pTab=pFWork.OpenTable("DLTB");
IQueryFilter pqf=new QueryFilterClass();
pqf.WhereClause="DLBM like '01_'";
ICursor pCur=pTab.Search(pqf,true);
2,IWorkspace.ExecuteSQL
能够执行关系数据库的所有DDL和DML类SQL语句。由于通过此函数执行Sql语句时会绕过ArcEngine的存贮机制,可能会破坏SDE数据的一致性(主要在更新SDE的系统表记录时),因此必须慎用。
另外,由于此函数执行后不返回结果,决定了用此函数不能执行查询语句。
//下面执行向DLJX的历史档案表中更新记录(SqlServer语法)。
//作用是:给创建时间在2009-7-13之后已删除的记录的创建时间改为2009-1-1
//IWorkspace pWork;
pWork.ExecuteSQL("update DLJX_H set GDB_FROM_DATE='2009-1-1' where objectid=2 and GDB_FROM_DATE>'2009-7-13' and GDB_TO_DATE<'9999-12-31' ");
//下面创建一个表
pWork.ExecuteSQL("CREATE TABLE IDS(ID BIGINT NOT NULL,BINDTYPE VARCHAR(20))");
3,用IQueryDef接口执行各种查询。
通过IQueryDef可以执行SQL数据库引擎所支持的所有查询,并且如果查询的表是要素类,还会正确返回要素类的最新数据(即使要素类启用了版本管理,且数据不更新到基表)
还能执行一些有用的查询。举例如下:
//查询要素类数据
//IFeatureWorkspce pFWork;
//IQueryDef pQDef=pFWork.CreateQueryDef();
pQDef.Tables="DLJX";
pQDef.WhereClause="JXLX='97'";
ICursor pCur=pQDef.Evaluate();
//判断某个表是否存在(如果此表未登记成GeometryTable,通过IWorkspace2.NameExists可能获取不到)
pQDef.SubFields = "id";
pQDef.Tables = "sysobjects";
pQDef.WhereClause = "id = object_id(N'IDS') and OBJECTPROPERTY(id, N'IsUserTable') = 1";
ICursor pCur=pQDef.Evaluate();
IRow pRow = pCur.NextRow();
if (pRow != null) {
bExist = true;
}
//聚合查询
//注意:对返回字段的处理,由于ArcEngine只简单的以逗号切分了SubFields内容,
//因此,如果包含有逗号时,字段名需要依次后推,且不支持字段别名定义
pQDef.SubFields = "count(*),sum(TDZMJ),sum(KZZMJ),left(ZLDWDM,6)";
pQDef.Tables = "DLTB group by left(ZLDWDM,6)";
ICursor pCur=pQDef.Evaluate();
针对上面所返回的ICursor,实际记录虽然只有四个字段,但ICursor.Fields却有五个元素,各字段名为:
count(*)、sum(TDZMJ)、sum(KZZMJ)、left(ZLDWDM、6)
因此要取第四个字段的值,需要这样:
int iInx=pCur.FindField("left(ZLDWDM");
IRow pRow=pCur.NextRow();
string sDM=pRow.get_Value(iInx).ToString();
//多表联接查询
pQDef.Tables="DLTB a left join XZQ b on a.ZLDWDM=b.XZQDM"
ICursor pCur=pQDef.Evaluate();
4,使用ArcEngine的统计类(实现了IDataStatistics接口)
//ICursor pCur=pDLTBTable.Search(null,false);
IDataStatistics pDataStat = new DataStatisticsClass();
pDataStat.Field = "MJ";
pDataStat.Cursor = pCur;
IStatisticsResults pRes = dataStatistics.Statistics;
//pRes.Sum