首页 / 浏览问题 / 桌面GIS / 问题详情
iObjects.Net打开工作空间进行sql检索的最大长度问题
250EXP 2022年08月17日
目前想要实现的是

1.把保存在sqlserver上的iDesktop能够打开的点数据集和一些sqlserver中iDesktop无法打开的数据集关联,然后筛选出特定数据的ID信息,作为字符串返回

2.在iObjects.Net中打开工作空间,然后对内部数据集使用"ID in (······)"和geometry进行空间检索,筛选出特定的数据,最后将这些数据导出。

现在遇到的问题是

在1返回字符串后,对本来应该存在数据的位置进行空间检索,检索失败。

我把拼接成的sql语句放到iDesktop中,发现字符串长度似乎无法超过32768,这之后的ID似乎都被截断了

请问这个sql语句的最大长度能否进行修改

使用的iObjects.Net的方法是

dataset.Query(geoRegion, 0, attributeFliter, CursorType.Static);

其中geoRegion是空间检索的范围,已确认没有问题

attributeFliter就是拼接出来的sql语句

1个回答

您好,您这里在步骤2的使用时具体怎么使用的,是用的什么表达查询形式,如何超限的?正常使用应该不会超限的。

一般多对象进行空间查询时,通常是将这些对象放到/取到一个recordset里,如何设置在空间查询对象参数SpatialQueryObject上进行使用,参与查询的几何对象再多也不影响出现sql语句超限的问题,不太明白你参与查询的对象多为什么会导致sql语句这么长。

如果不太会使用空间查询的话,可以看一下空间查询的范例程序哦,安装目录\SampleCode\Data\SpatialQuery

希望可以帮助到您。

9,453EXP 2022年08月17日

您好,因为iObjects.Net的空间检索无法关联无法被iDesktop打开的,sqlserver中的表,所以在进行空间检索之前,我会先在sql中关联其他的表,先筛选出这次要检索的所有点的id,然后放入dataset.Query检索

具体步骤如下

1.sql中获取最大十几万个点的id,拼成"id1,id2,id3,······"格式的字符串

2.打开工作空间里想要检索的数据集DatasetVector

3.对这个DatasetVector使用Query方法进行空间检索,获取结果Recordset

在第三部的Query方法中设置的attributeFliter具体为"DelFlg = 0 and ID in (" + "id1,id2,id3,······" + ")"

然后就发现sql的长度超了。请问在不修改数据库内部数据也不添加和其他表关联才能得到的新字段的前提下,这个空间检索有没有更好的方法实现。

大致步骤如图

大概理解你的意思了,但是不建议你现在这个后半段业务流程,sql语句里拼那么长也不合适。

你第一步的里几十万的id是怎么得到的?

1.地图框选得到的话,能不能使用选择集转记录集去进行查询。

2.几何面范围内的,能不能先进行一次空间查询,使用这次空间查询结果的对象,再进行空间查询。

3.单纯的属性规则,能不能使用><,或者其他聚类的标识字段。
1.地图框内显示的点也都是图中的点table和3个属性表关联后,将得到的经纬度和ID作为json格式保存到本地,然后读取这个json在地图上显示的

2.这个方法试过,是可行的,但处理的速度会变的非常慢,同样是最后会检索出500个上下的点数据,我这边在控制台发现,使用2的方法需要46秒左右,而使用我点太多会出问题的方法只需要8秒左右,客户那边可能也无法接受检索时间太长的问题

3.请问应该如何实现

关于筛选的条件的话是这样的

点table里有一个Shared,一个TableName属性,里面各有3种属性,用于筛选

然后表123和点table通过一个属性关联(left out join),然后筛选时会根据Shared的内容,选择表123里都具备的共通的属性添加筛选条件

比如Shared='非共有'时,就会从表123中筛选xxxDB.AccID = 登录用户的ID

比如Shared='限定共有',就会从表123中筛选xxxDB.Domain= '登录用户的Domain'
关于几十万id的话,Shared='全共有'会直接把全共有的部分(十几万的点)筛选中

另外非共有和限定共有也有好几万的点

都是通过上述筛选得到的
主要是这块的业务,为什么不能完全在数据源内解决数据这块的问题呢,

你现在这个用法的主要原因应该是有的属性信息甚至是几何信息,放到了空间数据库引擎数据源无关的纯数据库中。

我们产品上的可视化、索引、接口等方面,都是基于空间数据库引擎的数据源内来设计和性能考量的。

即使是打穿数据库,也是数据库型数据源内来使用,你这边突破gis引擎的数据设计,使用上会很不方便的。。
你数据集本身的属性表,或者属性表数据集中有没有存这个shared的字段?
数据集本身的属性表有Shared和TableName字段,然后当Shared的值是特定值的场合(非共有,限定共有),需要添加外部表1,2,3各自拥有的字段作为筛选条件,举例来说就是:非共有的场合,检索条件加上"(dataset.Shared = '非共有' and dataset.TableName= 'TableName1' and (TB1.AccID = 111 or TB2.AccID = 111 or TB3.AccID = 111))"

当需要复数个Shared的值的场合,每个Shared构成的括号()内的sql语句用or连接
了解你这边的业务逻辑,但是我们这边产品以往数据路线的话,一般是把额外属性导到数据集里,成属性表数据集,

或者直接就append,对矢量数据集追加业务字段列进去的使用方法。
嗯,感谢回复
...