注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

快乐小屋

 
 
 

日志

 
 

ArcEngine GDB数据库查询方法总结  

2013-08-26 20:45:59|  分类: ArcGIS Engine开 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
对于关系数据库,ArcEngine定义了几种查询接口:
  1. 常规的ITable、IFeatureClass接口
  这是我们最常使用的,完成同一个表内的数据查询、更新操作。
  1. // 假设之前已定义IFeaturWorkspace pFWork,并已赋值                                                                        ITablepTab=pFWork.OpenTable("DLTB");
  2. IQueryFilter pqf=new QueryFilterClass();
  3. pqf.WhereClause="DLBM like '01_'";
  4. ICursor pCur=pTab.Search(pqf,true);
复制代码

  2. IWorkspace.ExecuteSQL
  能够执行关系数据库的所有DDL和DML类SQL语句。由于通过此函数执行SQL语句时会绕过ArcEngine的存储机制,可能会破坏SDE数据的一致性(主要在更新SDE的系统表记录时),因此必须慎用。
  另外,由于此函数执行后不返回结果,决定了用此函数不能执行查询语句。
  1. //下面执行向DLJX的历史档案表中更新记录(SqlServer语法)。
  2. //作用是:给创建时间在2009-7-13之后已删除的记录的创建时间改为2009-1-1
  3. //假设之前已定义IWorkspace pWork,并已赋值
  4. pWork.ExecuteSQL("update  DLJX_H  set  GDB_
  5. FROM_DATE='2009-1-1' whereobjectid=2andGDB_
  6. FROM_DATE>'2009-7-13'  and  GDB_TO_DATE<'9999-12-31' ");
  7.   //下面创建一个表pWork.ExecuteSQL("CREATE  TABLE  IDS(ID  BIGINT NOT NULL, BINDTYPE VARCHAR(20))");
复制代码

  3. 用IQueryDef接口执行各种查询
  通过IQueryDef可以执行SQL数据库引擎所支持的所有查询,并且如果查询的表是要素类,还会正确返回要素类的最新数据(即使要素类启用了版本管理,且数据不更新到基表)。
  并且还能执行一些有用的查询。举例如下:
  1. //查询要素类数据
  2. //假设之前已定义IWorkspace pWork,并已赋值
  3. IQueryDef pQDef=pFWork.CreateQueryDef();
  4. pQDef.Tables="DLJX";
  5. pQDef.WhereClause="JXLX='97'";
  6. ICursor pCur=pQDef.Evaluate();
  7. //判断某个表是否存在(如果此表未登记成GeometryTable,通过IWorkspace2.NameExists可能获取不到)
  8. pQDef.SubFields = "id";
  9. pQDef.Tables = "sysobjects";
  10. pQDef.WhereClause  =  "id  =  object_id(N'IDS') and OBJECTPROPERTY(id, N'IsUserTable') = 1";                                       ICursor pCur=pQDef.Evaluate();
  11. IRow pRow = pCur.NextRow();
  12. if (pRow != null) {bExist = true;}
  13. //聚合查询
  14. //注意:对返回字段的处理,由于ArcEngine只简单的以逗号切分了SubFields内容,//因此,如果包含有逗号时,字段名需要依次后推,且不支持字段别名定义
  15. pQDef.SubFields = "count(*),sum(TDZMJ),sum(KZZMJ),left(ZLDWDM,6)";
  16. pQDef.Tables = "DLTB group by left(ZLDWDM,6)";ICursor pCur=pQDef.Evaluate();
复制代码

  针对上面所返回的ICursor,实际记录虽然只有四个字段,但ICursor.Fields却有五个元素,各字段名为:count(*)、sum(TDZMJ)、sum(KZZMJ)、left(ZLDWDM、6)因此要取第四个字段的值,需要这样:
  1. int iInx=pCur.FindField("left(ZLDWDM");
  2. IRow pRow=pCur.NextRow();
  3. string sDM=pRow.get_Value(iInx).ToString();
  4. //多表联接查询
  5. pQDef.Tables="DLTB  a  left  join  XZQ  b  on 
  6. a.ZLDWDM=b.XZQDM"
  7. ICursor pCur=pQDef.Evaluate();
复制代码

  4. 使用ArcEngine的统计类(实现了IDataStatistics接口)
  
  1. //假设之前已定义IFeaturWorkspace  pFWork,并已赋值
  2. ITable pTab=pFWork.OpenTable("DLTB");
  3. ICursor pCur=pDLTBTable.Search(null,false);
  4. I D a t a S t a t i s t i c s   p D a t a S t a t   =   n e w 
  5. DataStatisticsClass();
  6. pDataStat.Field = "MJ";
  7. pDataStat.Cursor = pCur;
  8. IStatisticsResults  pRes  =  dataStatistics.
  9. Statistics;
  10. //之后可以调用接口相关方法,比如计数:pRes.Sum
复制代码

  在实际应用中,第1种和第3种方法使用最多,基本上能满足大多的数据查询需求。
   第4种方法完全用第3种方法,但如果应用需要适应多种数据库类型的话,使用第4种方法更方便,但性能肯定没有第3种方法高,并且第4种方法不能进行多表 联合查询。个人认为,除了获取惟一值外,其它情况都可用第3种方法解决,如果出现不同数据库类型,查询语法格式不一致时,可以通过动态判断数据库类型实现 分支实现多个版本。
  第2种方 法,在一般情况下不建议使用。原因是由于没有返回值,主要用于数据库维护或记录更新操作。这在SDE体系外进行的操作,一不小心就会破坏SDE数据结构的 完整性、一致性。但也不能说此方法无用武之地了,做为其它方法的补充,可以用在存贮过程、视图、SDE体系之外的自定表的创建上,另外,对SDE系统表熟 悉的话,可以进行一些底层的维护,比如修改历史表记录的时间戳,修改锁等。
  评论这张
 
阅读(422)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018