首页 / 浏览问题 / 桌面GIS / 问题详情
FieldInfos字段数量过多时,AddNew总是返回false。
6EXP 2023年02月27日

使用程序转换数据到udb碰到一个文件转换之后没有构件数据。

发现是因为其属性字段太多有将近一千个,addnew接口一直返回false。

写了一段测试代码,向有一千个属性字段的数据集中添加对象。

测试文件:链接:https://pan.baidu.com/s/1ARmQnge1YvT60-VqUZ6IMA 提取码:2333

测试代码:

var m_workspace = new Workspace(); 
DatasourceConnectionInfo dsinfo = new DatasourceConnectionInfo(); 
sinfo.Server = @"test.udb"; 
dsinfo.EngineType = EngineType.UDB; 
dsinfo.Alias = "test"; 

Datasource m_ds = m_workspace.Datasources.Open(dsinfo); 
DatasetVector m_dv = m_ds.Datasets["test"] as DatasetVector; 
Recordset recordset = m_dv.GetRecordset(true, CursorType.Dynamic);
recordset.Batch.Begin(); 

GeoCylinder geoCylinder = new GeoCylinder(); 
geoCylinder.BottomRadius = 100; 
geoCylinder.TopRadius = 100;
geoCylinder.Height = 200; 
geoCylinder.Position = new Point3D(120, 29, 100);
 
Dictionary propertys = new Dictionary(); 

bool ret = recordset.AddNew(geoCylinder, propertys); 
recordset.Batch.Update(); 
recordset.Dispose();

m_dv.ComputeBounds(); 
m_dv.Close(); 

m_ds.Close();

1个回答

您好,新增记录失败是由于您的代码中开启了批量添加且当时数据集的字段太多了,导致底层构建的批量添加 SQL 语句太长,无法新增成功。建议处理这种字段特别多的数据集时,不采用批处理,直接调用 AddNew 接口新增数据并调用 Update 更新数据即可成功。

希望可以帮到您。
2,258EXP 2023年02月28日
谢谢您的回复!

我试了一下确实如您所说,不开启批处理时就可以添加成功。

请问字段大概超过多少时就不能开启批处理了呢?

批处理和非批处理在执行时间上差异大吗?

您好,关于 SQLite 支持的 SQL 最大长度可以从 SQLite 官网查询“SQLite 中的限制”,若拼接出来 SQL 语句超过该默认长度则会执行失败。

对于少量的 SQL 写入语句来说,批处理和非批处理的执行时间差异不大,对于大量的 SQL 写入语句来说,是会存在明显差异的。若您需要大量的执行写入 SQL 语句的操作的话,建议可以先对当前的数据集进行分表,做表关联,有效的控制每张属性表中存储的字段数量。

...