首页 / 浏览问题 / 组件GIS / 问题详情
普通属性表插数据
16EXP 2017年03月08日
我在desktop中新建属性表,我在给数据库插数据时,程序没报错,但是表里面没有数据。

我用for循环插10条数据  recordset.setInt32("smid", i+50);  用这个语句执行的

1个回答

插了数据要用Recordset.Update 方法 更新一下,如果插入多条数据,用Recordset.Batch 属性实现批量更新
胡林
2
5,985EXP 2017年03月09日
对于属性表,它里面没有地理信息字段,只有smid以及smuserid,我在插入其他字段值的时候程序不报错,但是插不进去。
你好,系统字段是不能操作的,SM开头的就是系统字段,只有SMuserid能够操作
我用Recordset.getGeometry 获取属性表里面的geometry然后在addNew进去就可以了,但是我在插入数据的时候发现会有遗漏,原本应该插入10条数据的,但是只插了8条数据,有时候只插9条数据,代码如下

for (int i = 0; i < 10; i++) {
   recordset.addNew(recordset.getGeometry());
    recordset.setInt32("SmUserID", i+50);
   ecordset.setInt64("roadid", i+50);
   recordset.setString("result2", String.valueOf((i+50)));
   recordset.setDouble("value", i+50);
   recordset.setDateTime("time", getdata("2017/03/07 13:00:11"));
   recordset.update();
                }
我先测试一下,插数据的时候最好先通过Recordset.IsEOF 属性 判断是否在最后一条记录下面,结合MoveNext方法使用
因为我是给属性表里面插数据,属性表中没有地理数据,所以不存在读行的操作吧

我测试了一下,没有什么问题,你看下我写的代码,我是.net写的

哦,我这边用java写的,感觉插数据的时候不稳定,而且耗时特别长,插10条数据就耗费了1秒,有没有什么可优化的?
数据量大的时候,用Recordset.Batch 属性 批量更新,这样能提高效率,我看你给出的代码,也看不出哪里有问题,不可能存在插数据不稳定的,肯定还是代码哪里有问题
BatchEditor editor = recordset.getBatch();
// 设置批量更新每次提交的记录数目
editor.setMaxRecordCount(10);
editor.begin();
int i=0;
while (!recordset.isEOF()) {
  Geometry geometry = recordset.getGeometry();
  Map<String,Object> map=new HashMap<String,Object> ();
  map.put("roadid", i);
  map.put("value", i);
  map.put("time", getdata("2017/03/07 13:00:11"));
  recordset.addNew(geometry, map);
  recordset.moveNext();
  i++;
  }
  // 批量操作统一提交
 editor.update();

这个是我按照参考文档的示例代码写的batch代码,但是每次只能插一条数据,
不用movenext,这种情况你自己做断点调试一下,看哪里有问题
你之前不是用的for循环吗,还是用循环试试,你完全按示例代码,也许哪个参数就不对了
你movenext,就把记录移到了最后一行,于是再次判断是否是最后一行的时候,判断为真,就不会再执行里面的语句了,所以只能添加一行记录
recordset.getBatch().setMaxRecordCount(20000);
recordset.getBatch().begin();
for (int i = 20; i < 60000; i++) {
  recordset.addNew(recordset.getGeometry());
  recordset.setInt32("SmUserID", i);
  recordset.setInt64("roadid", i);
  recordset.setDouble("value", i);
  recordset.setDateTime("time", getdata("2017/03/07 13:00:11"));
  }
                
recordset.getBatch().update();

我换用这个代码就可以了,能插入多条数据了,而且速度也有所提升,但是条数是对上了,可是里面会有重复数据,你遇到过这种情况么、?
重复是随机的还是有规律的
这个代码执行的结果是插入将近6W条数据,在第978条到999条这二十几条数据是每个都多插了一条。

没这个问题啊

这个是我

这个是我把表删完以后,重新插入的数据,这里面也有重复的,总条数的对的

你这个序号字段是什么,SMID才是这个表的主键,应该是SMID自动增长,不是创建的序号这个字段来代替主键的作用
我的代码里面没有给smid赋值,smid是根据recordset.addNew(recordset.getGeometry());这条语句自动生成的,我就只给后面几个字段赋值了,而且用的是i赋值,讲道理应该每个值都只有一个,但是却出现了重复,代码还是我刚刚贴出来的代码
smid本来就是自动增长的,那么SMID应该是1,2,3,4,5这样有顺序的排上去的,怎么你的表smid323115过了又是263115,而且我没在你的代码里看见你是怎么给“序号”这个字段赋值的

不好意思,好像系统有序号这个字段,我忘记了angry

序号是iDesketop里面自动生成的,不属于表中的字段,在roadid连续的时候smid不连续是不是批量添加的时候出问题了
你组件用的哪个版本,方便的话你直接把你的程序发给我,工程比较大的话你先上传到你的网盘,再把地址链接发给我
对了,你重新建一个空的属性表试一下
或者你直接用组件生成一个属性表再试一试
我用的是8C java版的,我刚试了一下给其他的属性表里面插数据,是连续的,那这个有重复的是什么原因呢?
我猜应该是删除数据的时候破坏了索引,具体的我也不清楚,这种情况不多见,意思是重新建的表就没问题了对吧
对,我在其他的属性表里面插数据的时候是连续的
那这么问题暂时先这样吧
好吧,谢谢你
这样,你把有问题的那个数据集发给我,我能重现问题的话可以报缺陷,我邮箱是hulin@supermap.com
...