新增图元到空间数据库

操作图纸,那首先是增加图元,一般MapX增加图元的方法,只要调用Layer. AddFeature方法,就可以将图元加入到图纸中,但在Spatial中增加图元,需要指定MI_PRINX主键值,才能加入,如下代码

Dim rvs As New MapXLib.RowValues, rv1 As New MapXLib.RowValue

Set rv1.Dataset = lyr.DataSets(lyr.name)

Set rv1.Field = lyr.DataSets(lyr.name).Fields("MI_PRINX")

rv1.Value = 1000001

rvs.Add rv1

lyr.Addfeature(obj, rvs)

 

MI_PRINX字段是使用EasyLoad工具上传后自动生成的一个主键字段如下图所示,估计是用来控制图元的唯一吧

 

但每次增加图元多需要指定这个值,而且我们如何保证这个值的唯一呢,后来看了一篇文章,说的是使用触发器自动自成ID的例子,于是就仿效了

先建一个序列

create sequence ID_MIPRINX_Seq
minvalue
1000000000
maxvalue
9999999999
start with
1000000000
increment by
1
cache
20;

 

       再建该层表的触发器

CREATE OR REPLACE TRIGGER MIPRINX_trigger
BEFORE INSERT
ON table1
FOR EACH ROW
DECLARE
newId table1.MI_PRINX%type;
BEGIN
if :new.MI_PRINX is null then
   SELECT ID_MIPRINX_Seq.nextval INTO newId FROM dual;
   :new.MI_PRINX := newId;
end if;
END;

 

这样就OK了,插入图元,就可以不用自己指定ID了,oracle就是强大啊

 

好景不长,新的问题又出现了,当MI_PRINX的值大于1000000时,画上去的图元就不能使用MapX进行移动,删除,纳闷了,难道空间数据库就只能支持1000000万条数据吗,苦思不得其解啊,后来发现数据库中存储是没什么问题,好像是MapX的缘故,那还不要命的啊,Mapinfo公司对MapX早就不支持了,如果解决不了,MapX+Oracle Spatial将落空,当然,对于数据量少的项目来说1000000也够用了。

 

经过不停的实验,最后终于找到了解决的方法,在用EasyLoad上传之前,先在Oracle中建好表,将MI_PRINX的字段类型改为varchar2,然后再上传

 

再试一下增加图元,没问题了,原来MapX对字符型做为主键也是支持的,估计MapX定义的变量类型是Integer,超过1000000就溢出了,MapX真弱,不过Mapinfo更绝,不能让MapX平滑过度到MapXtremeMapinfo的其他产品,害得我们跟着受苦

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值