Recordset.Update提交数据失败,并且程序被中断

0 投票
使用产品:supermap-iobjectsdotnet-10.0.1-18027-76100

操作系统:win10 x64
数据类型: mysql & shp文件
问题实现目标:

将shp文件的空间数据、属性数据,与其他业务字段录入mysql数据库
问题重现步骤:

1.读取shp文件的数据,存入临时数据源udb

2.创建mysql数据源,将udb中的记录集依次赋值给mysql记录集(创建记录集并依次赋值)

3.为记录集的其他业务字段赋值

4.调用Recordset.Update或者Recordset.Batch.Update更新数据库

问题是,有时在对某个shp文件进行数据录入时,调用Recordset.Update或者Recordset.Batch.Update的时候程序崩溃

已知:

1.多个shp文件的数据录入,代码段一致,其他shp文件录入数据正常

2.经过几个小时的测试,这个问题发生的概率约为50%,出现即程序崩溃,无法进入代码中捕获异常的阶段

3.使用Recordset.Update或者Recordset.Batch.Update都会出现这种情况,所以与哪种更新方式无关

数据没有办法上传,希望工程师可以联系我,远程协助我完成调试,谢谢
4月 1 分类:  46次浏览 | 用户: 璐璐8889 才疏学浅 (13 分)
重新分类 4月 1 用户:华红霞

1个回答

0 投票

你好,首先确认一下,这个问题是不是和导入shp数据失败是同一个问题http://qa.supermap.com/65072

4月 1 用户: 邬袁凯 名扬四海 (2,429 分)
不是哦,这个shp文件有数据集,也有记录集,不管是代码还是软件打开看都是ok的

到Recordset.Update的代码段,数据也是正常录入了的
你说的给mysql中进行赋值 我能问下你是先把mysql中的数据创建好了,然后给数据新增字段这样赋值吗? 还是说整个数据的字段都赋值给mysql数据集
//tempDatasource是udb临时数据源,datasource是mysql数据源
DatasetVector tempDatasetVector = (DatasetVector)tempDatasource.Datasets[index];
tempRecordset = tempDatasetVector.GetRecordset(false, SuperMap.Data.CursorType.Dynamic);
var tempFieldInfos = tempDatasetVector.FieldInfos;
var datasetVector = (DatasetVector)datasource.Datasets[tableName];
if (datasetVector == null)
{
	throw new Exception($"不存在数据集名称为{tableName}的数据集!");
}
recordset = datasetVector.GetRecordset(true, CursorType.Dynamic);
//设置批量提交
recordset.Batch.MaxRecordCount = 500;
recordset.Batch.Begin();

tempRecordset.MoveFirst();
//遍历临时记录集
for (Int32 i = 0; i < tempRecordset.RecordCount; i++)
{
	//往mysql新增记录
	Geometry geoPoint = tempRecordset.GetGeometry();
	recordset.AddNew(geoPoint);
	
	recordset.MoveLast();
	foreach (SuperMap.Data.FieldInfo fileInfo in tempFieldInfos)
	{
		if (!fileInfo.IsSystemField && importTableBase.IsHaveField(datasetVector.FieldInfos, fileInfo.Name))
		{
			recordset.Edit();
			recordset.SetFieldValue(fileInfo.Name, tempRecordset.GetFieldValue(fileInfo.Name));
		}
	}

	//处理业务数据
	//这里进行一些recordset.SetFieldValue的操作

	tempRecordset.MoveNext();
}

// 使用批量更新的Update,提交没有自动提交的记录
recordset.Batch.Update();

这个问题只在一个shp文件上发生,而且是时而发生,就很神奇,环境和代码、数据库连接都没有变化
看代码没有明显的错误,数据量太大崩溃可以考虑是内存溢出等问题,如果用的是32位组件可以考虑换64位的 或者把版本更新到最新版本,最新版对这些都有优化的
考虑了内存溢出,打断点监控了内存的问题,并没有内存溢出

sdk是引用的64位的,我试试更新版本吧

你好,经过排查,这个问题的原因在表结构上。shp文件和代码没有问题,表结构是通过SuperMap iDesktop建立的,表结构如图:

我经过多次尝试,在字段1-6的时候,添加记录集成功,25个字段的时候则不成功,出现程序崩溃的问题。请问,数据结构是哪里设置的不对?

另外,decimal应该选择什么类型呢?

Recordset.Update提交数据失败
...