博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SuperMap iObjects C++之记录集管理
阅读量:4163 次
发布时间:2019-05-26

本文共 4704 字,大约阅读时间需要 15 分钟。

–小诗

      在之前的博客中已经介绍过,数据源分为文件型数据源和数据库型数据源。

      数据库数据源中的数据的空间几何信息和属性信息是一体化存储的,一个矢量数据集对应一个关系型数据库(DBMS)中的表(Table),其几何形状以及属性信息都一体化存储其中,表中的几何字段存储要素的空间几何信息。对于矢量数据集中的纯属性数据集,其中没有几何字段,记录集为DBMS表的一个子集;
      而在文件型数据中空间几何信息和属性信息是分别存储的,记录集的应用可能比较让人费解,实际上,操作时是屏蔽掉文件型和数据库型数据的区别,将数据都看成是一个空间信息和属性信息一体化存储的表,而记录集是从其中取出的用来操作的一个子集。
      记录集中的一条记录,即一行,对应着一个要素,包含该要素的空间几何信息和属性信息。记录集中的一列对应一个字段的信息。
记录集可通过两种方式获得:
(1)在地图控件中选中若干个几何对象形成一个选择集,然后把选择集转换为记录集;
(2)从矢量数据集中获得一个记录集,也有两种方法,一可以通过UGDatasetVector.GetRecordset方法直接从矢量数据集中获取记录集,也可以通过查询语句获取记录集,所不同的是前者得到的记录集包含该类型集合的全部空间几何信息和属性信息,而后者得到的是经过查询语句条件过滤的记录集。
      这里通过UGRecordset类操作矢量数据的记录集,包括:添加、删除、移动记录,修改属性信息,获取记录对应的几何对象等。

      以下通过一段简单的示范程序,去演示如何创建一个空的点数据集,然后对其创建字段,添加记录以及批量添加空间和属性信息。

void SampleRun::ManageRecordset()

{
//创建数据源
UGDsConnection connection;
connection.m_nType = UGC::UDB;
connection.m_strServer = _U(“F:\TestUDB.udb”);
UGDataSource* pDataSource = UGDataSourceManager::CreateDataSource(UGEngineType::UDB);
pDataSource->GetConnectionInfo() = connection;

pDataSource->Create();//设置数据源别名pDataSource->SetAlias(_U("TestUDB"));//创建一个点数据集UGDatasetVectorInfo datasetVectorInfo;datasetVectorInfo.m_nType = UGDataset::Point;datasetVectorInfo.m_strName = _U("Point");UGDataset* pDataset = pDataSource->CreateDatasetVector(datasetVectorInfo);UGDatasetVector *pDatasetVector = dynamic_cast
( pDataset);//添加字段UGFieldInfo fieldInfo;fieldInfo.m_strName = _U("test");fieldInfo.m_nSize = 20;fieldInfo.m_nType = OgdcFieldInfo::Text;pDatasetVector->CreateField(fieldInfo);UGQueryDef queryDef;queryDef.m_nOptions = OgdcQueryDef::Both;UGRecordset *pRecordset = pDatasetVector->Query(queryDef);//开始编辑pRecordset->MoveFirst();pRecordset->Edit();UGGeoPoint* pGeoPoint = new UGGeoPoint();pGeoPoint->Make(10.5,10.5);//添加几何对象UGint id = pRecordset->AddNew(pGeoPoint);//修改属性信息pRecordset->SetFieldValue(_U("test"),_U("测试"));pRecordset->Update();//设置批量更新上限pRecordset->SetBulkMaxFeature(100);//设置开始批量编辑标志pRecordset->EditBulk(TRUE);UGGeoPoint tempPoint;for (UGint i = 0;i < 150 ;i++){ tempPoint.Make(i%10,i/10); pRecordset->AddNew(&tempPoint); pRecordset->SetFieldValue(_U("test"),_U("测试"));}//强制刷新pRecordset->FlushBulkEdit();//批量编辑结束pRecordset->EditBulk(FALSE);//修改几何信息pRecordset->MoveTo(id);UGGeometry * pTempGeomtry = NULL;pRecordset->GetGeometry(pTempGeomtry);UGGeoPoint * pPoint = dynamic_cast
(pTempGeomtry);pPoint->SetPoint(UGPoint2D(10,10));pRecordset->SetGeometry(*pPoint);pRecordset->Update();//批量编辑SmID < 110 的记录属性信息queryDef.m_strFilter = _U("SmID<110");queryDef.m_nOptions = OgdcQueryDef::Attribute;pRecordset = pDatasetVector->Query(queryDef);//设置批量更新上限pRecordset->SetBulkMaxFeature(100);//设置开始批量编辑标志pRecordset->EditBulk(TRUE);//移动指针到最前pRecordset->MoveFirst();//获取记录集个数UGint nCount = pRecordset->GetRecordCount();//开始修改记录集的属性为“Test1”UGString value;for(UGint i = 0;i
SetFieldValue(_U("test"),value.From(i)); pRecordset->MoveNext();}//强制刷新pRecordset->FlushBulkEdit();//批量编辑结束pRecordset->EditBulk(FALSE);//删除记录queryDef.m_strFilter = _U("test=10");queryDef.m_nOptions = OgdcQueryDef::Both;pRecordset = pDatasetVector->Query(queryDef);pRecordset->MoveFirst();pRecordset->Delete();delete pGeoPoint;pGeoPoint = NULL;delete pPoint;pPoint = NULL;

}

下文对代码中涉及的要点进行详细说明
添加字段
1.构建字段信息对象(UGFieldInfo对象),包括字段名称,字段类型等。
2.调用接口UGDatasetVector ->CreateField(fieldInfo)添加字段。
添加删除记录:
1.获取记录集,这里通过查询语句的方式获得满足条件的记录集(UGDatasetVector. Query)。
2.通过UGRecordset->AddNew接口将制定的几何对象追加到记录集中,从而实现添加一条记录。
3.对记录集的修改,包括添加、编辑记录、修改字段值的操作以后,需要调用接口UGRecordset->Update对修改结果进行提交,并且对一条记录做完修改就需要调用一次Update 来提交修改。
编辑属性信息:
以下代码示范了通过记录集编辑当前记录集对应几何对象的属性信息。
1.编辑几何对象的属性信息,需要通过接口UGRecordset-> Edit锁定并编辑 记录集的当前记录。
2.UGRecordset->SetFieldValue修改当前记录指定字段的字段值。
3.UGRecordset ->SetGeometry修改当前记录的几何信息。
4.调用接口UGRecordset->Update对修改结果进行提交。
批量编辑记录:
目前对批量更新功能的支持包括以下几点:
批量更新操作包括批量添加、批量更改、批量删除。
支持对 UGEngineType 中的可写文件型引擎和数据库型引擎类型数据源进行批量更新。
支持索引的自动维护,即当被更新的数据集有索引时,添加记录或者移动空间对象等操作会自动维护索引,不需要重新创建索引。
要点:
1.首先,通过UGRecordset->SetBulkMaxFeature接口设置批量更新上限。
2.UGRecordset->EditBulk (TRUE)设置开始批量编辑标志。
调用此方法之后,提交更新结果有两种方式,一个是自动提交,另一个是调用FlushBulkEdit () 方法显式提交。
当进行批量更新操作的过程中,如果更新完成的记录数等于UGRecordset->SetBulkMaxFeature设置的最大记录数,并且开始了下一条记录的更新操作,将自动提交已经完成更新的最大记录数的记录。例如,如果待更新的记录数为300,UGRecordset->SetBulkMaxFeature设置值为100,那么,在更新的过程中,当完成100条记录的更新操作,同时开始了第101条记录的更新,此时就自动提交已完成更新的100 条记录,当完成200条记录的更新操作,同时开始了第201条记录的更新,此时又自动提供100条记录,剩下的100条记录,由于没有第301条记录的更新操作,从201条记录到300条的记录需要调用UGRecordset-> FlushBulkEdit方法进行提交。上面的实例中,有2次自动提交的过程,同时每次自动提交100条记录的更新操作,而剩下的100条记录,由于没有第301条记录,因此只能调用UGRecordset-> FlushBulkEdit方法,进行提交。
另外,如果更新的记录数没有达到所设置的最大记录数,那么,需要调用UGRecordset-> FlushBulkEdit方法,进行更新结果的提交。
用户可以在任何需要的时候调用UGRecordset-> FlushBulkEdit方法显式提交所作的更新。
3.获取记录集个数,循环修改记录集中记录的字段值,通过UGRecordset->MoveNext移动记录“指针”到下一条记录。
4.UGRecordset->EditBulk (FALSE)设置开始批量编辑标志。

转载地址:http://ripxi.baihongyu.com/

你可能感兴趣的文章
用go的flag包来解析命令行参数
查看>>
来玩下go的http get
查看>>
队列和栈的本质区别
查看>>
matlab中inline的用法
查看>>
如何用matlab求函数的最值?
查看>>
Git从入门到放弃
查看>>
java8采用stream对集合的常用操作
查看>>
EasySwift/YXJOnePixelLine 极其方便的画出真正的一个像素的线
查看>>
Ubuntu Linux系统下apt-get命令详解
查看>>
ubuntu 16.04 下重置 MySQL 5.7 的密码(忘记密码)
查看>>
Ubuntu Navicat for MySQL安装以及破解方案
查看>>
HTTPS那些事 用java实现HTTPS工作原理
查看>>
oracle函数trunc的使用
查看>>
MySQL 存储过程或者函数中传参数实现where id in(1,2,3,...)IN条件拼接
查看>>
java反编译
查看>>
Class.forName( )你搞懂了吗?——转
查看>>
jarFile
查看>>
EJB与JAVA BEAN_J2EE的异步消息机制
查看>>
数学等于号是=那三个横杠是什么符
查看>>
HTTP协议详解
查看>>