操作图纸,那首先是增加图元,一般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平滑过度到MapXtreme或Mapinfo的其他产品,害得我们跟着受苦