• IQueryDef


    QueryDef 对象代表了数据库中基于一个或多个表、要素类的进行的属性查询。通过这个对象,用户可以在多个表间建立连接,并且保证在这个连接基础上的查询可以实现。

    QueryDef 中的表必须放在一个工作空间内,而QueryDef 对象也是用IFeatureWorkspace::CreateQueryDef 方法来产生,它并不是一个组件类。需要注意的是,它并不能在Shapefile 和Coverage 数据中使用,而仅仅可以使用在GeoDatabase数据库中。

    QueryDef 的查询的结果是Cursor 对象返回的,系统可以依据返回的Cursor 来获得基于查询的要素集合。但是使用这种方式获得的Cursor 对象,仅仅是只读的,Cursor 指向的行对象并没有和它们的父表相关联,因而如果试图对这些被选择出来的数据使用store 方法会出现错误。

    IQueryDef 是QueryDef 对象实现的主要接口,它定义了在多个表中定义连接需要使用的属性和方法。SubFields 属性是产生一个QueryDef 对象时的可选项,默认情况下它为“*”,它表示返回所有的字段。下面的例子用于显示如何产生一个QueryDef 对象,并使用它在两个表中产生一个连接,

     ' 产生一个QueryDef 对象
    Dim pQueryDef As IQueryDef
    pQueryDef = pFeatureWorkspace.CreateQueryDef
    ' 基于连接的两个表必须是在一个工作空间内,设置它的各种属性
    pQueryDef.Tables = "Counties, States"
    pQueryDef.SubFields = "COUNTIES.Shape, COUNTIES.NAME, STATES.STATE_ABBR"
    pQueryDef.WhereClause = "COUNTIES.STATE_FIPS = STATES.STATE_FIPS"

    IFeatureWorkspace::OpenFeatureQuery 方法会产生一个基于QueryDef 对象的要素类,这个要素类可以被作为一个要素图层被添加到一个Map 对象中去,它和ArcSDE 中的“视图”概念很类似。下面的例子就是基于一个上面产生的QueryDef 对象来新建一个要素类的例子,注意IQueryDed::SubFields 中必须设置一个字段,以保证新建的要素类有最少拥有一个属性字段:
    ' 新建一个要素类
    Dim pFeatureClass As IFeatureClass
    Dim pFeatureClassContainer As IFeatureClassContainer
    pFeatureClassContainer = pFeatureWorkspace.OpenFeatureQuery ("My counties join", pQueryDef)
    ' 判断IFeatureClassContainer 对象中是否有要素类存在
    If (pFeatureClassContainer.ClassCount <> 1) Then
    MsgBox "Failed to create feature class by query"
    Else pFeatureClass = pFeatureClassContainer.Class(0)
    End If
    ' 添加要素类到Map 对象
    Dim pFeatureLayer As IFeatureLayer
    pFeatureLayer = New FeatureLayerClass
    pFeatureLayer.FeatureClass = pFeatureClass
    pFeatureLayer.Name = pFeatureClass.AliasName
    pMap.AddLayer (pFeatureLayer)

    QueryDef 对象使用的SQL 语法和关系数据库中使用的SQL 语法是一样的,程序可以使用工作空间对象的ISqlSyntax 接口来获得这个数据库中的SQL 语法信息。

    QueryDef 代表了一个查询的子集,在数据库中,用户也可以使用SELECT 语句来得到同样的结果。但是QueryDef 并不能完整地支持SQL 语句。在ArcObjects 中的SQL 语句不能使用SQL 语句的order by,如果需要对选择的结果结果进行排序,可以使用ITablesort 接口进行操作。

  • 相关阅读:
    main函数的一些特性
    确保函数的操作不超出数组实参的边界
    今天学习了一点sed
    libevent 与事件驱动
    mvc3 action验证失败后的自定义处理
    使用spring.net+nibernate时如何用aspnet_regiis加密数据库连接字符串
    C# 中 IList IEnumable 转换成 List类型
    Nhibernate 过长的字符串报错 dehydration property
    小论接口(interface)和抽象类(abstract class)的区别
    C# 语言在函数参数列表中出现this关键词的作用
  • 原文地址:https://www.cnblogs.com/zhangjun1130/p/1433947.html
Copyright © 2020-2023  润新知