ObjectARX中对实体的操做通常有俩种方式,一种为open/close方式,另外一种维经过事务的方式.数据库
事务:经过程序对多个对象的多步操做集合成一个操做,若是事务操做成功,则对对象的操做成功,若是事务被停止,则取消对对象的操做,使用事务的好处是能够避免以上打开对象机制的限制.函数
#define actrTransactionManager acTransactionManagerPtr()
(1)AcDbTransactionManager::startTransaction:开始事务指针
startTransaction函数的定义形式为:code
virtual AcTransaction* startTransaction() = 0;
返回值:成功返回一个AcTransaction对象实例,失败返回NULL.对象
(2)AcDbTransactionManager::endTransaction:结束事务,结束一个事务的同时提交一个事务事务中所做的修改生效.事务
endTransaction函数的定义形式为:get
virtual Acad::ErrorStatus endTransaction() = 0;
(3)AcDbTransactionManager::abortTransaction:取消事务it
abortTransaction函数的定义形式为:io
virtual Acad::ErrorStatus abortTransaction() = 0;
(4)AcTransaction::getObject:获取所需的对象指针class
getObject函数的定义形式为:
virtual Acad::ErrorStatus getObject( AcDbObject*& obj, AcDbObjectId objectId, AcDb::OpenMode mode, bool openErasedObject = false) = 0;
经过事务修改数据库的具体实例以下:
//获取选择集 ads_name sset; int err = acedSSGet(_T("p"),NULL,NULL,NULL,sset); if(err != RTNORM) return; //开始事务 actrTransactionManager->startTransaction(); long length; acedSSLength(sset,&length); ads_name en; AcDbObjectId eId; AcDbEntity *pEnt = NULL; for(long i = 0; i < length; i++) { acedSSName(sset,i,en); //获取对象id Acad::ErrorStatus es =acdbGetObjectId(eId, en); //经过事务获取数据库对象 es = actrTransactionManager->getObject((AcDbObject*&)pEnt,eId,AcDb::kForWrite); pEnt->setColorIndex(1); } //提交事务 actrTransactionManager->endTransaction(); //释放选择集 acedSSFree(sset);