iClient客户端之关联查询-LinkItem

作者:Hyacinth

       在之前的博客“JavaScript客户端之连接查询”中,讲解了使用joinitem进行同一数据源的查询,除此之外,joinitem还能适用于不同数据源下,不过前提是需要建立视图表,这种方式从实质上说还是属于同源连接。那么就没有方法在不同数据库下进行关联查询吗?答案是有的,就是接下来要介绍的LinkItem。
       LinkItem,关联信息类,用于矢量数据集与外部表的关联。外部表是另一个数据集(其中纯属性数据集中没有空间几何信息)中的 DBMS 表,矢量数据集与外部表可以属于不同的数据源。值得注意的是:数据源类型目前只支持SQL Server和Oracle类型。空间数据和属性数据必须满足关联条件,即主空间数据集与外部属性表之间存在关联字段。
       接下来我们通过具体的接口以及参数来认识熟悉LinkItem,这里以JavaScript为例,首先来看看LinkItem的相关属性吧。
这里写图片描述
       从上图,我们不难发现datasourceConnectionInfo是连接外表的入口,那我们到底需要提供什么参数进去呢,同样还是通过一张图表理解一下
这里写图片描述
       在前面我们提到过,linkitem现在只作用于Oracle与SQL SERVER数据库,所以,这里就用JavaScript和Flash客户端以这两个数据库为例,怎样去设置外部表的连接信息以及关联主空间数据集表
JavaScript_sqlserver:

var dc = new SuperMap.REST.DatasourceConnectionInfo({
                dataBase: "link",//数据源对应的数据库名
                server: "ss-PC",//数据库服务器名   
                user: "supermap",
                password: "supermap",
                driver: "SQL Server",//oracle数据库不需要设置这个参数
                connect: true,
                OpenLinkTable: false,
                alias: "supermap",
                engineType: SuperMap.REST.EngineType.SQLPLUS,//引擎类型
                readOnly: false,
                exclusive: false
            });

            // 设置关联信息
            var linkItem = new SuperMap.REST.LinkItem({
                datasourceConnectionInfo: dc,
                foreignKeys: ["SmID"],//数据集的外键 **必填**
                foreignTable: "SMDTV_1",//外部表表名 **必填**
                linkFields: ["name"],//需返回的外部表的属性 这里不进行设置的话,需要在FilterParameter的fileds里进行设置 否则不返回该表的任何属性
				linkFilter:"SmID<5",
                name: "link2",
                primaryKeys: ["SmID"],//外部表的主键 **必填**
            });
var  queryParam = new SuperMap.REST.FilterParameter({
                name: "World@SUPERMAP",
                attributeFilter: "SmID<5",
              //fields:["Countries.SmID","SMDTV_1.name"], 若linkFields没有进行设置 则这里需设置要返回的主表以及外部表的属性字段
              linkItems: [linkItem]
            });

这里提供一下flash客户端的关键代码
Flash_Oracle:

var dataSrcConnecInfo:DatasourceConnectionInfo = new DatasourceConnectionInfo();
				dataSrcConnecInfo.server = "supermap";
				dataSrcConnecInfo.dataBase = "link";
				dataSrcConnecInfo.connect = true;
				dataSrcConnecInfo.engineType = EngineType.ORACLE_PLUS;
				dataSrcConnecInfo.user = "link";
				dataSrcConnecInfo.password = "supermap";
				dataSrcConnecInfo.alias = "link";
				dataSrcConnecInfo.readOnly = false;
				dataSrcConnecInfo.exclusive = false;
				
				//关联信息
				var linkItem:LinkItem = new LinkItem();
				linkItem.datasourceConnectionInfo = dataSrcConnecInfo;
				linkItem.foreignKeys = new Array("SMID");//主表的外键
				linkItem.foreignTable = "SMDTV_1";
				linkItem.linkFilter = "SMID<5";
				linkItem.name = "shuxin";
				linkItem.linkFields = new Array("name");
				linkItem.primaryKeys = new Array("SMID");//外表的主键

       这里需要提醒大家一点,如果关联的外表foreignTable是在SuperMap iDesktop810版本中新建的数据集或者纯属性表,那外部表的名字不是对应的数据集的名字,可在表的属性信息里查看数据表名,如下图:
这里写图片描述
2.所关联的外部表现在只支持SuperMap管理的表,即通过iDesktop或者组件等产品新建的数据集的对应的表或者属性表;
3.linkFilter与外部属性表的连接条件,可以不设置,如果你设置的话,也应和查询FilterParameter的attributeFilter条件相对应,不然会出现外部表属性无值或者部分要素有值的现象;
4.Oracle与SqlServer之间可实现关联查询,比如,工作空间及数据源是Oracle数据库型的,是可以关联SqlServer数据源里的表,反之亦然。
到这里,关联查询linkitem的介绍就结束了,想要实现跨库查询的朋友们,快快试一试吧!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值