ObjectARX_事務

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);
相關文章
相關標籤/搜索