http://bbs.esrichina-bj.cn/ESRI/thread-58345-1-1.html
看了论坛里几乎所有 的ArcEngine的统计问题和解答,似乎都是只点了一下,根本没有人深入去解释,本人也遇到这样的问题,统计Oracle数据库的某表的数据,然后与 地图图层关联起来,再做渲染,但是用ArcEngine里的接口却得不到Oracle数据库的某表的统计数据,不知何解。
本人思路:
1、统计数据与图层关联:将统计数据与地图图层进行关联之前,要先获取地图图层和统计结果,而且统计结果得可用于进行关联,因此要进行第二步转换工作;
2、使用ArcEngine接口将统计结果转换为可关联数据类型,那如何获取统计结果,这就需要进行第三步;
3、使用ArcEngine接口去对Oracle数据表进行分类统计,得到统计结果;
但问题出在第三步,总是ArcEngine接口怎么都得不到统计结果,可以对Oracle数据表进行分类,但每一类的数量都是0,查了帮助和网上的资料,都不得其解。
表:element
id
type_id
distric_id
name
update_time
1
1
84b3d2de-0cca-4abe-88f6-496a043b36b0
A
2009-11-11
2
2
84b3d2de-0cca-4abe-88f6-496a043b36b0
B
2009-11-11
3
1
e6e51df3-b17b-4072-9ac1-b926a67b2f1b
C
2009-11-11
4
4
3bb4046a-42f6-462b-bcf2-f5cd4923b70d
D
2009-11-11
5
3
84b3d2de-0cca-4abe-88f6-496a043b36b0
E
2009-11-11
6
4
039d3379-a409-4a25-aa2e-9ae139f3961b
F
2009-11-11
7
3
fde526f6-c57b-4dd5-8603-1f89659ed102
G
2009-11-11
8
5
3bb4046a-42f6-462b-bcf2-f5cd4923b70d
H
2009-11-11
9
7
fde526f6-c57b-4dd5-8603-1f89659ed102
I
2009-11-11
id:ID
type_id:类型ID
distric_id:区域ID
name:名称
udate_time:更新时间
代码如下:
第三步,连接Oracle数据库:
IPropertySet propertySet = new PropertySetClass();
propertySet.SetProperty("CONNECTSTRING", "Provider=oraoledb.oracle;Data Source=test;User Id=test;Password=test");
IWorkspaceFactory workspaceFactory = new OLEDBWorkspaceFactoryClass();
IFeatureWorkspace featureWorkspace = workspaceFactory.Open(propertySet, 0) as IFeatureWorkspace;
//写法一可以分类,但得不到统计结果
IQueryDef queryDef = featureWorkspace.CreateQueryDef();
queryDef.SubFields = "count(id),distric_id";
queryDef.Tables = "(select * from element where type_id<>1 and type_id<>2) group by distric_id";
//写法二直接报错,说SQL语句未完成之类
//IQueryDef queryDef = featureWorkspace.CreateQueryDef();
//queryDef.SubFields = "count(id),distric_id";
//queryDef.WhereClause = "type_id<>1 and type_id<>2";
//queryDef.Tables = “element group by distric_id";
第二步,转换:
IQueryName2 queryName = new TableQueryNameClass();
queryName.QueryDef = queryDef;
IDataset dataset = featureWorkspace as IDataset;
IWorkspaceName workspaceName = dataset.FullName as IWorkspaceName;
IDatasetName datasetName = queryName as IDatasetName;
datasetName.WorkspaceName = workspaceName;
datasetName.Name = "ReleTable";
IName name = queryName as IName;
ITable releTable = name.Open() as ITable;
目前代码测试到这里,releTable 里可以按distric_id进行分组排序,但是count(id)不起作用,直接变成releTable的字段count(id),值为null
此时使用ICursor cursor = queryDef.Evaluate();测试过,cursor里的count(id)确实是没用进行聚合统计。
或许此时有人会说,怎么不用统计接口呢?
IDataStatistics dataStatistics = new DataStatisticsClass();
……
IStatisticsResults statisticsResults = dataStatistics.Statistics;
但这些统计接口也达不到目标,不能按distric_id区域ID进行数量统计,统计的字段只能为数值类型,而我的distric_id区域ID为Guid类型,使用便出错。
还有本人的最终目标是将表格的数据按区域进行分类统计,得到各个区域的元素总数,然后和区域图层关联,在区域图层里以柱状图显示各区域的元素数量。
这个元素表是一个独立的Oracle数据表,不是空间数据表,除了区域ID能与区域图层的区域ID字段关联,没有其它关系。
图层与外部普通表格数据关联,本人查到的资料是需将外部普通表转换为ITable类型然后才能进行关联,还有一些其它办法,就是以SQL查询出统计结果,然后保存为各种GIS数据类型,然后再读取,再与区域图层关联,但这种设计不敢恭维。
不知道各位能否找出本人写的代码存在什么问题吗?或许有其它更好的办法
请指教