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);