ARCGIS 与SQL的衔接
对于关系数据库,ArcEngine定义了几种查询接口:
1. 常规的ITable、IFeatureClass接口
这是我们最常使用的,完成同一个表内的数据查询、更新操作。
//假设之前已定义IFeaturWorkspace pFWork,并已赋值 ITablepTab=pFWork.OpenTable("DLTB");
IQueryFilter pqf=new QueryFilterClass();
pqf.WhereClause="DLBM like '01_'";
ICursor pCur=pTab.Search(pqf,true);IQueryFilter pqf=new QueryFilterClass();
pqf.WhereClause="DLBM like '01_'";
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,并已赋值
pWork.ExecuteSQL("update DLJX_H set GDB_
FROM_DATE='2009-1-1' whereobjectid=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,并已赋值
IQueryDef pQDef=pFWork.CreateQueryDef();
pQDef.Tables="DLJX";
pQDef.WhereClause="JXLX='97'";
ICursor pCur=pQDef.Evaluate();
//判断某个表是否存在(如果此表未登记成GeometryTable,通过IWorkspace2.NameExists可能获取不到)
pQDef.SubFields = "id";
pQDef.Tables = "sysobjects";
pQDef.WhereClause = "id = object_id(N'IDS') andOBJECTPROPERTY(id, N'IsUserTable') =1"; ICursor pCur=pQDef.Evaluate();
IRow pRow = pCur.NextRow();
if (pRow != null) {bExist = true;}
//聚合查询
//注意:对返回字段的处理,由于ArcEngine只简单的以逗号切分了SubFields内容,//因此,如果包含有逗号时,字段名需要依次后推,且不支持字段别名定义
pQDef.SubFields = "count(*),sum(TDZMJ),sum(KZZMJ),left(ZLDWDM,6)";
pQDef.Tables = "DLTB group by left(ZLDWDM,6)";ICursorpCur=pQDef.Evaluate();针对上面所返回的ICursor,实际记录虽然只有四个字段,但ICursor.Fields却有五个元素,各字段名为:count(*)、sum(TDZMJ)、sum(KZZMJ)、left(ZLDWDM、6)因此要取第四个字段的值,需要这样:int iInx=pCur.FindField("left(ZLDWDM");
IRow pRow=pCur.NextRow();
string sDM=pRow.get_Value(iInx).ToString();
//多表联接查询
pQDef.Tables="DLTB a left join XZQ b on
a.ZLDWDM=b.XZQDM"
ICursor pCur=pQDef.Evaluate();
4.使用ArcEngine的统计类(实现了IDataStatistics接口)
//假设之前已定义IFeaturWorkspace pFWork,并已赋值
ITable pTab=pFWork.OpenTable("DLTB");
ICursor pCur=pDLTBTable.Search(null,false);
I D a t a S t a t i s t i c s p D a t a S t a t = n e w
DataStatisticsClass();
pDataStat.Field = "MJ";
pDataStat.Cursor = pCur;
IStatisticsResults pRes = dataStatistics.
Statistics;
//之后可以调用接口相关方法,比如计数:pRes.Sum
在实际应用中,第1种和第3种方法使用最多,基本上能满足大多的数据查询需求。
第 4 种方法完全用第 3 种方法,但如果应用需要适应多种数据库类型的话,使用第 4 种方法更方便,但性能肯定没有第 3 种方法高,并且第 4 种方法不能进行多表联合查询。个人认为,除了获取惟一值外,其它情况都可用第 3 种方法解决,如果出现不同数据库类型,查询语法格式不一致时,可以通过动态判断数据库类型实现分支实现多个版本。
第 2 种方法,在一般情况下不建议使用。原因是由于没有返回值,主要用于数据库维护或记录更新操作。这在 SDE 体系外进行的操作,一不小心就会破坏 SDE 数据结构的完整性、一致性。但也不能说此方法无用武之地了,做为其它方法的补充,可以用在存贮过程、视图、 SDE 体系之外的自定表的创建上,另外,对 SDE 系统表熟悉的话,可以进行一些底层的维护,比如修改历史表记录的时间戳,修改锁等。转发。
ARCGIS 与SQL的衔接相关推荐
- Arcgis连接sql server发布地图服务详解
Arcgis+sql server发布地图服务详解 1.ArcGIS中创建企业地理数据库 通过ArcGIS创建一个地理数据库至SQLServer数据库中. 1.需要有一个登陆ArcGIS的管理员账号, ...
- ArcGIS对比MapInfo
2008-03-28 | ArcGIS对比MapInfo 标签: mapinfo arcgis 地图 autocad 查询 一. 用户手册(User Manual): 个人认为" ...
- MapInfo、ArcGIS 狙击战 1
一. 用户手册(User Manual): 个人认为"用户手册"是学习.使用一个东西最好的资料. 功能 ArcGIS MapInfo 文档组织 典型的高大全 只有一个 系 ...
- Arcgis api for Javascript + arcgisServer + arcSDE笔记(1)
最近要搞的项目要用Arcgis api for Javascript做地图模块,自己开始学相关的技术.这是之前整理的笔记,现在传到博客上,也作为学习的记录 0 环境搭建 Arcgis软件统一使用10. ...
- java 必备面试必备
1.JDK 和 JRE 有什么区别? JDK(Java Development Kit),Java开发工具包 JRE(Java Runtime Environment),Java运行环境 JDK中包含 ...
- ArcGIS+Sql Server发布要素服务
什么是要素服务 要素服务可用来通过 Internet 提供要素,并提供显示要素时所要使用的符号系统.之后,客户端可执行查询操作以获取要素,并执行相应的编辑操作.要素服务提供了可用于提高客户端编辑体验的 ...
- 教你发布Silverlight Bussiness Application(SQL Server 登录,局域网访问,以及使用ArcGIS Server服务需要注意的问题)...
教你发布Silverlight Bussiness Application(SQL Server 登录,局域网访问,以及使用ArcGIS Server服务需要注意的问题) 原文:教你发布Silverl ...
- ArcGIS——数据库空间SQL(一、oracle中使用sql空间查询及st_astext等函数出错问题)
一.引言 将shp文件导入oracle中就想着直接用sql进行普通查询和空间查询,这样直接通过webserver发布就可以不用arcgis server直接进行接口调用了,感觉这样比较接触底层些,所以 ...
- ArcGIS中定义查询和属性查询的SQL语句的坑
转载请注明作者(独孤尚良dugushangliang)出处:https://blog.csdn.net/dugushangliang/article/details/93757726 之前遇到过这种情 ...
最新文章
- 谷歌搜索:几乎所有的英文搜索都用上BERT了
- linux服务器文件后缀名,linux服务器备份网站程序并下载到本地(自动)
- 07/11/20 资料整理
- 【Python小工具函数】各种日期格式的转换、在某个日期上减去n天、判断List中是否含有数字
- js(Dom+Bom)第一天(1)
- 作者:周涛(1979-),男,博士,启明星辰教授级高级工程师、大数据实验室副主任。...
- Android studio 插件安装
- makefile:带你了解一种常用于GNU gcc编译的工具语言
- ftpphp_PHP实现ftp上传文件示例
- 15道AI 机器学习笔试题(暂时没有答案)
- [转载]matlab中分号、冒号、逗号等常用标点符号的作用
- 百度编辑器的样式手机端配置
- html点击按钮跳出消息框
- 关闭搜狗输入法-录音助手
- 考研概率论与数理统计(知识点梳理)
- mesos java_mesos 入门
- css3D制作立体旋转小方块
- uni-app项目的收获及心得体会
- android 7.1 字体大小设置,一加3t官方更新氢的Android 7.1.1,妥妥的第一时间换上クレPro 字体...
- SwitchHosts!:修改 hosts 文件的方便助手
热门文章
- 数据结构/排序/选择排序/简单选择排序
- python3抠图并更换背景
- 面试送命题,你为什么从上家公司离职?
- springboot整合微信支付
- 解决“Windows 平台 FIPS 验证的加密算法的一部分”问题
- 从高盛的技术“开源”看金融业软件发展未来
- 【洛谷】P4147 玉蟾宫 解题报告
- java一个整数加100是完全平方_Java计算一个数加上100是完全平方数,加上168还是完全平方数...
- Holt-Winters
- 小米手机第三方卡刷软件_小米Max卡刷教程_小米Max用recovery刷第三方系统包