感谢杰夫的欢迎!
你用我用“垂直”是什么意思?
如前所述,我的代码确实早就应该进行一些重构了。
我听从了WILL HATCH的建议,将所有操作都保留在1笔交易中。
这花了一些工作,但结果如下:
- Sub Main()
- ' Get the current document and database
- Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
- Dim acCurDb As Database = acDoc.Database
- ' Lock the document
- Using acLckDoc As DocumentLock = acDoc.LockDocument()
- ' Start a transaction
- Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
-
- Call function1()
- dim obj as DbObject = function2()
- If TypeOf (obj) Is BlockReference Then
- Call function3(obj)
- end if
- ' Save the changes
- acTrans.Commit()
- End Using ' Transaction
- End Using ' Lock
- End Sub
- Function method1()
- ' Get the current document and database
- Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
- Dim acCurDb As Database = acDoc.Database
- Dim acTrans As Transaction = db.TransactionManager.TopTransaction
- Dim blkTable As BlockTable = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)
- If blkTable.Has(_blockName) Then
- ......
- End If
- End Function
- Function method2() as DBObject
- ' Get the current document and database
- Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
- Dim acCurDb As Database = acDoc.Database
- Dim acTrans As Transaction = db.TransactionManager.TopTransaction
- Dim pPtOpts As PromptEntityOptions = New PromptEntityOptions("")
- ' Prompt for the start point
- pPtOpts.Message = vbLf & _prompt
- pPtOpts.AllowNone = False
- Dim pPtRes As PromptEntityResult = acDoc.Editor.GetEntity(pPtOpts)
- ' Exit if the user presses ESC or cancels the command
- If pPtRes.Status = PromptStatus.Cancel Then Return Nothing
- Return acTrans.GetObject(pPtRes.ObjectId, OpenMode.ForRead)
- End Function
- sub method3(_blkRef as BlockReference)
- ' Get the current document and database
- Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
- Dim acCurDb As Database = acDoc.Database
- Dim acTrans As Transaction = db.TransactionManager.TopTransaction
- Dim attCol As AttributeCollection = _blkRef.AttributeCollection
- For Each attId As ObjectId In attCol
- Dim attRef As AttributeReference = DirectCast(acTrans.GetObject(attId, OpenMode.ForWrite), AttributeReference)
- Dim recievedValue As String = get_AttVal(attRef.Tag, _attVals)
- If Not String.IsNullOrEmpty(recievedValue) Then attRef.TextString = recievedValue
- Next
- End sub
目前我遇到了与管理大量事务,管理单个事务完全相反的麻烦:
我正在左右回避以下错误:
“由于对象的当前状态,操作无效。
我有代码想要在同一事务的早期打开ForRead的对象上Allready已经准备好打开ForRead/Write。
也许我正在使这种方式变得复杂?
|