AO开发SDE(三)

注:文章内容都为实际项目需求开发轨迹

今天主要是数据库的直连方式和两种数据加载过滤方式。直连是不可避免的,肯定会在AO中直接连接数据库来读取数据等,至于两种数据加载过滤方式主要是为了不显示不需要的数据,已加快地图的绘制效率,提高用户交互性等。

两种过滤方式为Add query Layer和definition query。

Add query Layey选择在加载数据之前过滤,只加载满足条件的数据,支持复杂的查询,包括分区表查询等。

definition query是将数据全部加载进来后,再定义的一个过滤显示,只能控制数据的显示量,而数据的真实大小该多大还是多大,只是过滤了而已。

Add query Layey

   	    IWorkspaceFactory2 pWorkspaceFactory = new SqlWorkspaceFactoryClass();
            string pString = "dbclient=oracle10g;" + "serverinstance=192.168.114.119/ONEMAP;" + "USER=SDE;" + "PASSWORK=SDE";
            ISqlWorkspace pSqlWorkspace = pWorkspaceFactory.OpenFromString(pString, 0) as ISqlWorkspace;
            IQueryDescription pQueryDescription = pSqlWorkspace.GetQueryDescription("SELECT * FROM SDE.GJJJG PARTITION (ZHONGQI)");
//根据查询条件获取IQueryDescription,sql功能是查询了一个分区表

            ITable pTable=pSqlWorkspace.OpenQueryClass("test", pQueryDescription);
            IFeatureClass pFeatureClass = pTable as IFeatureClass;
            pFeatureLayer.FeatureClass = pFeatureClass;
            axMapControl1.Map.AddLayer(pFeatureLayer as ILayer);

dbclient 为数据库版本,跟在选择直连方式时下拉菜单内容一样
serverinstance oracle与sqlserver的写法有点不一样 ,oracle一般为192.168.114.119/ONEMAP,如果有端口增加端口,用户名密码都一样写法
definition query:
这个很简单,只需要连接打开数据库获取到相应的数据。设置一个过滤条件就可以了。用法简单,就是不支持分区过滤,只能改善显示,不能改善查询效率。

        IFeatureLayerDefinition pFeatureLayerDefinition = pFeatureLayer as IFeatureLayerDefinition;
                     pFeatureLayerDefinition.DefinitionExpression = "NAME = '中旗'";

效率对比:一张表数据库代销约400M,数据约50w条。add query layer 加载某一个分区,数据约8W条,进行一次查询斌并遍历一次耗时15秒

definition layer加载数据后过滤显示,显示条件与分区效果一致。进行一次查询耗时22秒左右。确实是能提高查询效率(查询条件查询出的结果比较多)


纠结的事情:本来打算是将一张很大的数据进行分区,这样子可以改善查询效率和控制显示,但是支持分区查询的方式不支持数据编辑。支持数据编辑的definition query只能控制显示而不能改善查询效率。在这情况下分区的意义显得不大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值