作者: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的介绍就结束了,想要实现跨库查询的朋友们,快快试一试吧!