SuperMap iObjects C++之记录集管理

–小诗

      在之前的博客中已经介绍过,数据源分为文件型数据源和数据库型数据源。
      数据库数据源中的数据的空间几何信息和属性信息是一体化存储的,一个矢量数据集对应一个关系型数据库(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<UGDatasetVector*>( 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<UGGeoPoint*>(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<nCount;i++)
{
	pRecordset->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)设置开始批量编辑标志。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值