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 接口进行操作。

原文地址:https://www.cnblogs.com/zhangjun1130/p/1433947.html