转载 http://virgoooos.iteye.com/blog/512329

转载:http://blog.csdn.net/mydriverc/archive/2007/07/26/1709210.aspx 
评论;我试验了,其实可以使用IqueryFilter.subField="distinct(FiledName)"直接Search 就行

有时我们需要读取图层中某个字段的所有值的唯一值集合,或做统计用途,或作为其他功能的输入。 
一般通过IDataStatistics接口来获取唯一值集合,代码如下:

  1. ''' <summary>
  2. ''' 通过IDataStatistic接口获取图层指定字段的唯一值
  3. ''' </summary>
  4. ''' <param name="pFeatureLayer">目标图层</param>
  5. ''' <param name="strField">目标字段名</param>
  6. ''' <returns>目标字段的所有值的唯一值集合</returns>
  7. ''' <remarks></remarks>
  8. Public Function GetUVByDataStatistics()Function GetUVByDataStatistics(ByVal pFeatureLayer As IFeatureLayer, ByVal strField As String) As IList(Of String)
  9. Dim uvList As IList(Of String) = New List(Of String)
  10. Dim pQueryFilter As IQueryFilter = New QueryFilter
  11. Dim pFeatureCur As IFeatureCursor
  12. pQueryFilter.SubFields = strField
  13. pFeatureCur = pFeatureLayer.FeatureClass.Search(pQueryFilter, True)
  14. Dim pDataStatic As IDataStatistics = New DataStatistics
  15. pDataStatic.Field = strField
  16. pDataStatic.Cursor = pFeatureCur
  17. Dim pEnumvar As System.Collections.IEnumerator = pDataStatic.UniqueValues
  18. pEnumvar.Reset()
  19. While pEnumvar.MoveNext
  20. Dim pObj As Object = pEnumvar.Current
  21. uvList.Add(pObj.ToString)
  22. End While
  23. Return uvList
  24. nd Function

但当图层的数据量很大时,以上这种方法执行起来速度较慢,性能影响比较明显,得考虑使用另外一种方法。通过IQueryDef接口使用类似SQL的查询语句来获取图层字段的唯一值集合,执行速度等同于执行SQL查询语句。

  1. ''' <summary>
  2. ''' 通过IQueryDef接口查询字段的唯一值
  3. ''' </summary>
  4. ''' <param name="pFeatureLayer">目标图层</param>
  5. ''' <param name="strField">目标字段名</param>
  6. ''' <returns>目标字段的所有值的唯一值集合</returns>
  7. ''' <remarks></remarks>
  8. Public Function GetUVByQueryDef()Function GetUVByQueryDef(ByVal pFeatureLayer As IFeatureLayer, ByVal strField As String) As IList(Of String)
  9. Dim uvList As IList(Of String) = New List(Of String)
  10. Dim pQueryDef As IQueryDef
  11. Dim pRow As IRow
  12. Dim pCursor As ICursor
  13. Dim pFeatureWorkspace As IFeatureWorkspace
  14. Dim pDataset As IDataset
  15. pDataset = pFeatureLayer.FeatureClass
  16. pFeatureWorkspace = pDataset.Workspace
  17. pQueryDef = pFeatureWorkspace.CreateQueryDef
  18. With pQueryDef
  19. .Tables = pDataset.Name ' Fully qualified table name
  20. .SubFields = "DISTINCT(" & strField & ")"
  21. pCursor = .Evaluate
  22. End With
  23. pRow = pCursor.NextRow
  24. While Not pRow Is Nothing
  25. )
  26. uvList.Add(pObj.ToString)
  27. pRow = pCursor.NextRow
  28. End While
  29. Return uvList
  30. End Function

转载:http://www.southgis.com/bz/199.html 
对于关系数据库,ArcEngine定义了几种查询接口: 
1. 常规的ITable、IFeatureClass接口 
    这是我们最常使用的,完成同一个表内的数据查询、更新操作。假设之前已定义IFeaturWorkspace pFWork,并已赋值。

  1. 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的系统表记录时),因此必须慎用。 
  另外,由于此函数执行后不返回结果,决定了用此函数不能执行查询语句。 
//下面执行向DLJX的历史档案表中更新记录(SqlServer语法)。 
//作用是:给创建时间在2009-7-13之后已删除的记录的创建时间改为2009-1-1 
//假设之前已定义IWorkspace pWork,并已赋值。

  1. pWork.ExecuteSQL("update DLJX_H set GDB_FROM_DATE='2009-1-1'
  2. where objectid=2andGDB_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数据库引擎所支持的所有查询,并且如果查询的表是要素类,还会正确返回要素类的最新数据(即使要素类启用了版本管理,且数据不更新到基表)。 
  并且还能执行一些有用的查询。举例如下: 
//查询要素类数据 
//假设之前已定义IWorkspace pWork,并已赋值

  1. IQueryDef pQDef=pFWork.CreateQueryDef();
  2. pQDef.Tables="DLJX";
  3. pQDef.WhereClause="JXLX='97'";
  4. ICursor pCur=pQDef.Evaluate();

//判断某个表是否存在(如果此表未登记成GeometryTable,通过IWorkspace2.NameExists可能获取不到)

  1. pQDef.SubFields = "id";
  2. pQDef.Tables = "sysobjects";
  3. pQDef.WhereClause  =  "id  =  object_id(N'IDS') and OBJECTPROPERTY(id, N'IsUserTable') = 1";
  4. ICursor pCur=pQDef.Evaluate();
  5. IRow pRow = pCur.NextRow();
  6. if (pRow != null) {bExist = true;}

//聚合查询 
//注意:对返回字段的处理,由于ArcEngine只简单的以逗号切分了SubFields内容,//因此,如果包含有逗号时,字段名需要依次后推,且不支持字段别名定义

  1. pQDef.SubFields = "count(*),sum(TDZMJ),sum(KZZMJ),left(ZLDWDM,6)";
  2. 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");

  1. IRow pRow=pCur.NextRow();
  2. string sDM=pRow.get_Value(iInx).ToString();

//多表联接查询

  1. pQDef.Tables="DLTB a left join XZQ b on
  2. a.ZLDWDM=b.XZQDM"
  3. ICursor pCur=pQDef.Evaluate();

4. 使用ArcEngine的统计类(实现了IDataStatistics接口) 
  //假设之前已定义IFeaturWorkspace  pFWork,并已赋值

  1. ITable pTab=pFWork.OpenTable("DLTB");
  2. ICursor pCur=pDLTBTable.Search(null,false);
  3. IDataStatistics pDataStat = new DataStatisticsClass();
  4. pDataStat.Field = "MJ";
  5. pDataStat.Cursor = pCur;
  6. IStatisticsResults  pRes  =  dataStatistics.

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

转载:ArcEngine 唯一值查询的更多相关文章

  1. MySQL三个列组成唯一值查询_开源中国问题练习_20161026

    问题地址:https://www.oschina.net/question/2923955_2202674 按 service_collect_day分类以后,按 app_id,node_id,ser ...

  2. mysql 获取全局唯一值

    在涉及数据库存储数据的时候,经常会遇到唯一值问题,有的是主键带来的限制,有的则是业务上的需要. 下面介绍几种唯一值的获取或者生产方法: 先建一个测试用的表tbl_user,有三个字段:Id.Name. ...

  3. Oracle12c中性能优化新特性之新增APPROX_COUNT_DISTINCT 快速唯一值计数函数

    Oracle11g中,为了改善DBMS_STATS包收集统计信息时的唯一值计数功能,增加了 APPROX_COUNT_DISTINCT函数,但文档中未记载.Oracle12c文档中包括了该函数,因此, ...

  4. SQL系列(四)—— 唯一值(distinct)

    有时需要查询某列上的不重复的数据,如: SELECT name FROM student; 结果: name lxy lxy lxy lxy 这样的结果显然不符合我们的需求.如何对列数据进行去重,查询 ...

  5. 生成GUID唯一值的方法汇总(dotnet/javascript/sqlserver)

    一.在 .NET 中生成1.直接用.NET Framework 提供的 Guid() 函数,此种方法使用非常广泛.GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的任何两台计 ...

  6. AE唯一值符号化的流程以及过程

    唯一值符号化的流程以及过程(转)   一.获取ServerStyle库中的符号       Style符号库在ArcGIS Engine开发中对应的是ServerStyle符号库,可以通过专门的转换程 ...

  7. NBOJv2 1004 蛤玮打扫教室(线段树区间更新区间最值查询)

    Problem 1004: 蛤玮打扫教室 Time Limits:  1000 MS   Memory Limits:  65536 KB 64-bit interger IO format:  %l ...

  8. (转载)全球唯一标识GUID

    GUID(Global unique identifier)全局唯一标识符,它是由网卡上的标识数字(每个网卡都有唯一的标识号)以及 CPU 时钟的唯一数字生成的的一个 16 字节的二进制值. GUID ...

  9. 【RMQ】 区间最值查询详解

    1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A ...

随机推荐

  1. Django商城项目笔记No.13用户部分-用户中心个人信息

    首先处理个人信息的显示 邮箱绑定: 首先给用户的模型类里添加一个字段来说明用户的邮箱是否激活 然后数据库迁移 python manage.py makemigrations python manage ...

  2. MUST_COMPLETE

    应用: xxx主机: xxx时间: 2018-03-07 04:34:03.887线程: [scheduler-1]级别: ERROR Class: org.springframework.sched ...

  3. 分享一个excel根据文件超链接获取链接文档的最后更新时间

    #获取制定单元格内超链接对应的链接地址Sub geturi() For Each cell In Range("E3:E43") If cell.Hyperlinks.Count ...

  4. Python2.7-glob

    glob 模块,寻找所有匹配指定的模式的路径名,利用的是 Unix shell 的规则,可以在 Windows 环境下使用.模块是通过 os.listdir() 和 fnmatch.fnmatch() ...

  5. js 获取当前页url网址信息

    转载地址:js如何准确获取当前页面url网址信息 摘录: 举例一个URL,然后获得它的各个组成部分:http://i.cnblogs.com/EditPosts.aspx?opt=1 1.window ...

  6. Can't create component 'xxx.xxx.xxx' as it has dependencies to be satisfied

    问题描述: Can't create component 'xxx.xxx.xxx' as it has dependencies to be satisfied. 问题原由: 没有对新建的实体映射类 ...

  7. Linux中的do{...} while(0)

    摘抄自: <<Linux设备驱动开发详解(第二版)>> 在 Linux 内核中,经常会看到do{} while(0)这样的语句,许多人开始都会疑惑,认为do{} while(0 ...

  8. 搞个组装机:D

    时间:2016年7月 主机:就是主机 整机:主机+显示器 推荐:自己组装,淘宝或者京东,或者去淘宝上的宁美国度.攀升兄弟看看. 4000多块配个电脑: 处理器:i5 4590 散片(发热量小) 111 ...

  9. Linux学习笔记(第十一章)

    文件系统及程序资源的配置ulimit: 环境变量: bash变量 alias设定变量别名 设定别名 取消别名 指令执行顺序 组合键 通配符 数据流重导向 多指令 以下命令都需用管道符链接: 截取命令: ...

  10. 20155321 《网络攻防》 Exp7 网络欺诈防范

    20155321 <网络攻防> Exp7 网络欺诈防范 实验内容 简单应用SET工具建立冒名网站 因为钓鱼网站是在本机的http服务下使用,因此需要将SET工具的访问端口改为http默认的 ...