乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 194|回复: 14

.IsDynamicBlock 返回 false ?

[复制链接]

5

主题

27

帖子

12

银币

初来乍到

Rank: 1

铜币
36
发表于 2013-9-3 08:06:41 | 显示全部楼层 |阅读模式
大家好,
在工作中被困了几个小时,不知道你们谁能帮助我?
(我打赌你能)
我正在做的事情:
-有一个包含相关块和动态块的“主dwg ”
-运行一个例程,用块参考填充新生产图的模型空间,如果块还没有出现在新生产图中,则从“主DWG”导入。
-导入“常规”和动态块。
-能够在需要的地方和时间设置属性和动态特性
-在该初始插入方法之后,所有的块都被插入并在适当的位置标注尺寸,需要进行一定的检查。
我遍历模型空间并基于BlockRef。Name需要执行某个动作
-这适用于我的常规块,但是动态块都有那些匿名的名字,比如“*U24”,使它们避开我的名字检查。

找到了获取动态块的“EffectiveName”的解决方案:
  1.    
  2. Public Shared Function EffectiveName(ByVal blkref As BlockReference) As String
  3.         If blkref.IsDynamicBlock Then
  4.             Return DirectCast(blkref.DynamicBlockTableRecord.GetObject(OpenMode.ForRead), BlockTableRecord).Name
  5.         Else
  6.             Return blkref.Name
  7.         End If
  8. End Function

但问题是:blkref。IsDynamicBlock allways返回false!
因此,即使我在模型空间中的动态块插入良好,属性和动态特性设置正确,并且在编程上运行良好,它们也不会被识别为动态块?
为什么会这样?

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

4

主题

219

帖子

4

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
238
发表于 2013-9-3 09:42:27 | 显示全部楼层
看不到更多的代码。IsDynamicBlock被调用,我几乎可以肯定这个调用是以这样的方式进行的:您在一个事务中获得一个Blockreference对象,然后在获得BlockReference的那个事务之外传递BlockReference对象(以获得它的“有效名称”)。这就是IsDynamicBlock返回false的原因,即使您确实知道该块是动态块引用。
传递通过事务获得的对象是不好的,并且正如您刚刚经历的那样,在事务范围之外获得DBObject的属性可能不会得到您想要的东西。相反,您总是在事务之间传递ObjectID,并在活动事务的范围内获取DBObject的属性。
回复

使用道具 举报

5

主题

27

帖子

12

银币

初来乍到

Rank: 1

铜币
36
发表于 2013-9-3 10:20:56 | 显示全部楼层
嘿n.yuan,谢谢回复!
这就是我这样做的方式(代码方面):
步骤1)插入我的动态块:
  1.         ...
  2.         ' assure the desired doorsketchBlock is present in the blocktable
  3.         acadBlockId = Acad.searchOrImportBlock(Acad.SketchblocksFileName, blockName)
  4.         ' insert the block in modelspace
  5.         acadblockref = Acad.InsertBlock(blockName, insPnt, 1, 1, 1, _acParentBlockref.Rotation)
  6.         'Set Dynamic properties
  7.         AttVals.Clear()
  8.         AttVals.Add("Lookup|" & dimNuttigeBreedte & " x " & dimPaneelBreedte)
  9.         AttVals.Add("Paneeldikte|" & _acParentBlockref.ScaleFactors.Y)
  10.         AttVals.Add("Draairichting|" & conDraairichting)
  11.         Acad.set_DynamicBlockProperties(acadblockref, AttVals)
  12.         'Set Attributes
  13.         AttVals.Clear()
  14.         AttVals.Add("InventTransId|" & genInventTransId)
  15.         AttVals.Add("DIM|" & dimNuttigeBreedte & "|" & dimPaneelBreedte & "|" & dimNuttigeHoogte & "|" & _acParentBlockref.ScaleFactors.Z & "|" & doorPanelConn)
  16.         AttVals.Add("ONDERBOUW|" & IIf(conVerzonkenOpstelling, _
  17.                                        Acad.get_AttValByIdx(_acParentBlockref, 3) & "|" & conVerzonkenOpstelling, _
  18.                                        Acad.get_AttValByIdx(_acParentBlockref, 3)))
  19.         Acad.set_BlockAttributes(acadblockref, AttVals)
  20.         ...

4种方法在上面的代码中发挥作用:
Acad.searchOrImportBlock(检查当前绘图中是否已经存在所需的块可块,如果没有,它将从“主绘图”中获取它)
Acad.InsertBlock(知道所需的块存在于当前绘图的可块中,它会将其插入模型空间并返回一个BlockResources对象)
Acad.set_DynamicBlockProperties(用于设置给定BlockResources的动态属性)
Acad.set_BlockAttributes(用于设置属性值给定的Block引用)
Acad.searchOrImportBlock
  1.     Shared Function searchOrImportBlock(_sourceFileName As String, _blockName As String) As ObjectId
  2.         ' Get the current document and database
  3.         Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  4.         Dim acCurDb As Database = acDoc.Database
  5.         ' Lock the document
  6.         Using acLckDoc As DocumentLock = acDoc.LockDocument()
  7.             ' Start a transaction in the database
  8.             Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  9.                 ' Get the Block table for the current database
  10.                 Dim acBlockTbl As BlockTable = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)
  11.                 ' If found in local BlockTableRecord
  12.                 If acBlockTbl.Has(_blockName) Then
  13.                     Return acBlockTbl(_blockName)
  14.                 End If
  15.             End Using ' Dispose of the transaction
  16.         End Using ' Unlock the document
  17.         ' If not found in local BlockTableRecord then Import from _sourceFileName
  18.         Return importBlockFromSourceFile(_sourceFileName, _blockName)
  19.     End Function
  20.     Shared Function importBlockFromSourceFile(_sourceFileName As String, _blockName As String) As ObjectId
  21.         Dim sourceDb As New Database(False, True)
  22.         Dim acObjIdColl As ObjectIdCollection = New ObjectIdCollection()
  23.         ' Read the DWG into a side database
  24.         sourceDb.ReadDwgFile(_sourceFileName, System.IO.FileShare.Read, True, "")
  25.         Using acTrans As Transaction = sourceDb.TransactionManager.StartTransaction()
  26.             ' Open the block table
  27.             Dim bt As BlockTable = DirectCast(acTrans.GetObject(sourceDb.BlockTableId, OpenMode.ForRead, False), BlockTable)
  28.             If bt.Has(_blockName) Then
  29.                 acObjIdColl.Add(bt(_blockName))
  30.                 'SendCommandMessage(vbCrLf & "Imported block: '" & _blockName & "' from '" & _sourceFileName & "'" & vbCrLf)
  31.             End If
  32.             '' Check each block in the block table
  33.             'For Each btrId As ObjectId In bt
  34.             '    Dim btr As BlockTableRecord = DirectCast(acTrans.GetObject(btrId, OpenMode.ForRead, False), BlockTableRecord)
  35.             '    If btr.Name = _blockName Then
  36.             '        acObjIdColl.Add(btr.ObjectId)
  37.             '        SendCommandMessage(vbCrLf & "Importing block: " & btr.Name)
  38.             '    End If
  39.             '    btr.Dispose()
  40.             'Next
  41.         End Using
  42.         Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  43.         Dim acCurDb As Database = acDoc.Database
  44.         ' Lock the document
  45.         Using acLckDoc As DocumentLock = acDoc.LockDocument()
  46.             ' Start a transaction in the database
  47.             Using acTrans = acDoc.TransactionManager.StartTransaction()
  48.                 ' Open the Block table for read
  49.                 Dim acBlkTblNewDoc As BlockTable
  50.                 acBlkTblNewDoc = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)
  51.                 ' Open the Block table record Model space for read
  52.                 Dim acBlkTblRecNewDoc As BlockTableRecord
  53.                 acBlkTblRecNewDoc = acTrans.GetObject(acBlkTblNewDoc(BlockTableRecord.ModelSpace), OpenMode.ForRead)
  54.                 ' Clone the objects to the new database
  55.                 Dim acIdMap As IdMapping = New IdMapping()
  56.                 acCurDb.WblockCloneObjects(acObjIdColl, acBlkTblRecNewDoc.ObjectId, acIdMap, DuplicateRecordCloning.Ignore, False)
  57.                 ' Commit the transaction
  58.                 acTrans.Commit()
  59.             End Using ' Dispose of the transaction
  60.         End Using ' Unlock the document
  61.         'Return ObjectId
  62.         Return acObjIdColl(0)
  63.     End Function

Acad.InsertBlock
  1.    
  2.     Shared Function InsertBlock(ByVal _blockName As String, ByVal insPt As Point3d, ByVal xBlkScale As Double, _
  3.                                 ByVal yBlkScale As Double, ByVal zBlkScale As Double, ByVal ang As Double) As BlockReference
  4.         ' Get the current document and database
  5.         Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  6.         Dim acCurDb As Database = acDoc.Database
  7.         ' Lock the document
  8.         Using acLckDoc As DocumentLock = acDoc.LockDocument()
  9.             ' Start a transaction in the database
  10.             Using acTrans = acDoc.TransactionManager.StartTransaction()
  11.                 Dim blkTable As BlockTable = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)
  12.                 If blkTable.Has(_blockName) Then
  13.                     Dim blkObjId As ObjectId = blkTable(_blockName)
  14.                     Dim blkRef As BlockReference = New BlockReference(insPt, blkObjId)
  15.                     blkRef.SetDatabaseDefaults()
  16.                     blkRef.ScaleFactors = New Scale3d(xBlkScale, yBlkScale, zBlkScale)
  17.                     blkRef.Rotation = ang
  18.                     Dim blkTblRec As BlockTableRecord
  19.                     ' Assumes the current space was already changed to.
  20.                     blkTblRec = acTrans.GetObject(acCurDb.CurrentSpaceId, OpenMode.ForWrite)
  21.                     blkTblRec.AppendEntity(blkRef)
  22.                     acTrans.AddNewlyCreatedDBObject(blkRef, True)
  23.                     ' add the attribute definitions.
  24.                     Dim blkTblR As BlockTableRecord = blkObjId.GetObject(OpenMode.ForRead)
  25.                     For Each objId As ObjectId In blkTblR
  26.                         Dim obj As DBObject = objId.GetObject(OpenMode.ForRead)
  27.                         If TypeOf obj Is AttributeDefinition Then
  28.                             Dim ad As AttributeDefinition = objId.GetObject(OpenMode.ForRead)
  29.                             Dim ar As AttributeReference = New AttributeReference()
  30.                             ar.SetAttributeFromBlock(ad, blkRef.BlockTransform)
  31.                             ar.Position = ad.Position.TransformBy(blkRef.BlockTransform)
  32.                             blkRef.AttributeCollection.AppendAttribute(ar)
  33.                             acTrans.AddNewlyCreatedDBObject(ar, True)
  34.                         End If
  35.                     Next
  36.                     ' Commit the transaction
  37.                     acTrans.Commit()
  38.                     Return blkRef
  39.                 End If
  40.             End Using ' Dispose of the transaction
  41.         End Using ' Unlock the document
  42.     End Function

Acad.set_DynamicBlockProperties
  1. Shared Sub set_DynamicBlockProperties(_blkRef As BlockReference, _attVals As List(Of String))
  2.         ' Get the current document and database, and start a transaction
  3.         Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  4.         Dim acCurDb As Database = acDoc.Database
  5.         ' Lock the new document
  6.         Using acLckDoc As DocumentLock = acDoc.LockDocument()
  7.             ' Start a transaction in the new database
  8.             Using acTrans = acDoc.TransactionManager.StartTransaction()
  9.                 'Open _blkRef For writing
  10.                 _blkRef = DirectCast(acTrans.GetObject(_blkRef.Id, OpenMode.ForWrite), BlockReference)
  11.                 For Each dynamicProperty As DynamicBlockReferenceProperty In _blkRef.DynamicBlockReferencePropertyCollection
  12.                     Dim recievedValue As String = get_AttVal(dynamicProperty.PropertyName, _attVals)
  13.                     If Not String.IsNullOrEmpty(recievedValue) Then
  14.                         If is_DynamicValueAllowed(recievedValue, dynamicProperty) Then
  15.                             If IsNumeric(recievedValue) Then
  16.                                 dynamicProperty.Value = CDbl(recievedValue)
  17.                             Else
  18.                                 dynamicProperty.Value = recievedValue
  19.                             End If
  20.                         Else
  21.                             MsgBox("Voor DynamicBlock '" & _blkRef.Name & "'" & _
  22.                                    " werd voor property '" & dynamicProperty.PropertyName & "'" & _
  23.                                    " getracht de niet-toegestane waarde '" & recievedValue & "' mee te geven." & _
  24.                                    vbLf & vbLf & _
  25.                                    "Gelieve dit te controleren !", vbOKOnly + MsgBoxStyle.Exclamation)
  26.                         End If
  27.                     End If
  28.                 Next
  29.                 ' Commit the transaction
  30.                 acTrans.Commit()
  31.             End Using ' Dispose of the transaction
  32.         End Using ' Unlock the document
  33.     End Sub

Acad.set_BlockAttributes
  1.     Shared Sub set_BlockAttributes(_blkRef As BlockReference, _attVals As List(Of String))
  2.         ' Get the current document and database, and start a transaction
  3.         Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  4.         Dim acCurDb As Database = acDoc.Database
  5.         ' Lock the new document
  6.         Using acLckDoc As DocumentLock = acDoc.LockDocument()
  7.             ' Start a transaction in the new database
  8.             Using acTrans = acDoc.TransactionManager.StartTransaction()
  9.                 Dim attCol As AttributeCollection = _blkRef.AttributeCollection
  10.                 For Each attId As ObjectId In attCol
  11.                     Dim attRef As AttributeReference = DirectCast(acTrans.GetObject(attId, OpenMode.ForWrite), AttributeReference)
  12.                     Dim recievedValue As String = get_AttVal(attRef.Tag, _attVals)
  13.                     If Not String.IsNullOrEmpty(recievedValue) Then attRef.TextString = recievedValue
  14.                 Next
  15.                 ' Commit the transaction
  16.                 acTrans.Commit()
  17.             End Using ' Dispose of the transaction
  18.         End Using ' Unlock the document
  19.     End Sub

我不认为上述代码有任何功劳。没有一个是完全编译粘贴的,最近它是完全手工编写的吗?
步骤2)遍历插入的块:
我已经收集了“Sketch”层中的所有Block引用,现在我想评估它们,并根据它们的名称采取行动
  1.   
  2.        'Perform individual convertion per block in the SketchBlocksCollection, based on it's type (Name)
  3.         For Each acSketchBlockRef As BlockReference In SketchBlocksCollection
  4.             Select Case acSketchBlockRef.Name
  5.                 Case "SketchHoekBlock V"
  6.                     convert_Corner_vertical(acSketchBlockRef, SketchBlocksCollection)
  7.                 Case "SketchVloerBlock"
  8.                     Dim MaxUsedFloorPanelLenght = convert_Floor(acSketchBlockRef, SketchBlocksCollection, SketchConversionSettings, sketchOrigins, MaxUsedLength)
  9.                     MaxUsedLength = Math.Max(MaxUsedLength, MaxUsedFloorPanelLenght)
  10.                 Case "SketchPlafondBlock"
  11.                     Dim MaxUsedCielingPanelLenght = convert_Cieling(acSketchBlockRef, SketchBlocksCollection, SketchConversionSettings, sketchOrigins, MaxUsedLength)
  12.                     MaxUsedLength = Math.Max(MaxUsedLength, MaxUsedCielingPanelLenght)
  13.                 Case "SketchPaneelBlock"
  14.                     convert_Wall(acSketchBlockRef, SketchBlocksCollection, SketchConversionSettings, SketchHorizontalCornerBlocksCollection, SketchDeurBlocksCollection)
  15.                 [b]Case "SketchDraaiDeurBlock", "SketchDraaiDeurDubbelBlock", "SketchSchuifDeurBlock"[/b]
  16.                     convert_Door(acSketchBlockRef) 'code never reached
  17.                 Case "SketchVBNBlock"
  18.                     convert_VBN(acSketchBlockRef, SketchConversionSettings, sketchOrigins)
  19.                 Case Else
  20.             End Select
  21.         Next acSketchBlockRef

这里出错了:
Case"SketchDraaiDeurBlock
因此acSketchBlockRef.Name计算结果为(例如)"*U24",而不是"SketchDraaiDeurBlock"。
我尝试了这个:
  1.   For Each acSketchBlockRef As BlockReference In SketchBlocksCollection
  2.             Select Case[b] EffectiveName(acSketchBlockRef)[/b]
  3.                 Case "SketchHoekBlock V"
  4.                     convert_Corner_vertical(acSketchBlockRef, SketchBlocksCollection)
  5.                 Case "SketchVloerBlock"
  6.                     Dim MaxUsedFloorPanelLenght = convert_Floor(acSketchBlockRef, SketchBlocksCollection, SketchConversionSettings, sketchOrigins, MaxUsedLength)
  7.                     MaxUsedLength = Math.Max(MaxUsedLength, MaxUsedFloorPanelLenght)
  8.                 Case "SketchPlafondBlock"
  9.                     Dim MaxUsedCielingPanelLenght = convert_Cieling(acSketchBlockRef, SketchBlocksCollection, SketchConversionSettings, sketchOrigins, MaxUsedLength)
  10.                     MaxUsedLength = Math.Max(MaxUsedLength, MaxUsedCielingPanelLenght)
  11.                 Case "SketchPaneelBlock"
  12.                     convert_Wall(acSketchBlockRef, SketchBlocksCollection, SketchConversionSettings, SketchHorizontalCornerBlocksCollection, SketchDeurBlocksCollection)
  13.                 Case "SketchDraaiDeurBlock", "SketchDraaiDeurDubbelBlock", "SketchSchuifDeurBlock"
  14.                     convert_Door(acSketchBlockRef)
  15.                 Case "SketchVBNBlock"
  16.                     convert_VBN(acSketchBlockRef, SketchConversionSettings, sketchOrigins)
  17.                 Case Else
  18.                     convert_Door(acSketchBlockRef)
  19.             End Select
  20.         Next acSketchBlockRef

使用方法'有效名称'being:
  1. Public Shared Function EffectiveName(ByVal blkref As BlockReference) As String
  2.         If blkref.IsDynamicBlock Then
  3.             Return DirectCast(blkref.DynamicBlockTableRecord.GetObject(OpenMode.ForRead), BlockTableRecord).Name
  4.         Else
  5.             Return blkref.Name
  6.         End If
  7. End Function

但是在这里,blkref.IsDynamicBlock总是返回false。
这是一个满嘴的!
有什么想法吗?
回复

使用道具 举报

4

主题

219

帖子

4

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
238
发表于 2013-9-3 15:17:40 | 显示全部楼层
快速说明,在您的 importBlockFromSourceFile() 函数中,您应该在 using 变量中创建端数据库,这样您就不必担心它的处置(您没有这样做)
关于您遇到的问题,您能告诉我您正在做什么来创建您正在迭代的 SketchBlocksCollection 吗?
回复

使用道具 举报

5

主题

27

帖子

12

银币

初来乍到

Rank: 1

铜币
36
发表于 2013-9-3 15:39:22 | 显示全部楼层
好吧,只有您在“步骤2”中显示的代码与问题相关(对于每个...下一步选择案例...在其中)。但是,您没有显示“对于每个...接下来是在.
对于每个...Next 只有在事务范围内,并且SketchBlockCollection中的块引用在事务范围内获得时才有效,如下所示:
''在某个地方,您可能有这样的代码来构建您的块引用集合
公共函数GetSketchBlocks() 作为块引用
块的列表 作为块引用列表=新....
''您可能使用了其中一个 Editor.SelectXXX() methos
Using tran As Transaction=MyDb.TransactionManager.StartTransaction()
''获取 Blockrefernce 对象并添加到 StechBlockCollection 此处
的块。Add(tran.GetObject(.....)      
传输。Commit()
End Using
Return blocks
End Function
''然后你可以运行 For Each ...在此
阶段,Blockreference 对象不在获取它的事务范围之外
,因此一些属性会丢失(例如 IsDynamicBlock)
对于每个 blk 作为 SketchCollection 中的 Blockreference
Select Case EffectiveName()。ToUpper()
....
结束 选择

一步 对于该代码结构,您可能认为最好将用于将BlockReference收集到单独方法的集合中的代码,以便它可以在其他地方重用,例如
公共函数GetSketchBlocks()作为BlockReference列表

结束函数
这是出现问题时:您需要一个事务将选定的 ObjectId 转换为 BlockReference,以便将它们放入集合中。在方法结束时,事务完成,您将 DBObject(在本例中为 BlockReference)传递给其他方法以进行进一步处理。然后,正如我在前面的回复中指出的那样,您遇到了问题:您应该传递ObjectId而不是DBObject,并且仅在需要时访问当前事务中的DBObject属性。
所以,你应该有一个这样的方法:
公共函数GetSketchBlocks() As ObjectIdCollection
....
'' 只返回 ObjectId 或 ObjectId 的集合,以便其他进程重用此代码
End Function
在需要读取 BlockReference' 属性的地方,您可以'
''获取 selelcted 块作为 ObjectId 的集合,而不是 DBObject
SktechBlocks=GetSketchBlocks()
'''在事务中使用
tran As Transaction=....()
对于每个 id 作为 SketchBlockCollection
Dim BlkRef 作为 BlockReference = tran。GetObject(id,...)
选择案例有效名称(blkReg)
....
结束 选择
下一个
tran.提交()
结束使用
回复

使用道具 举报

12

主题

64

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
112
发表于 2013-9-3 16:39:10 | 显示全部楼层
这太有意义了!
我不再工作了,现在回家了。我会按照你说的重新做我的代码。
你说得对,我确实通过一个返回“Block ref集合”的函数收集我的SketchBlock(Blockrefs)。
它被称为“collect_SketchBlocks”(或类似的东西,这里没有它)
它只是抓取具有“SKETCH”作为其层的Blockrefs的ModelSpace,当找到时将它们添加到集合中。
完成后,...它关闭了它正在使用的事务。
从来没有想过这会给我带来这个麻烦...
如果我理解正确,我将不得不创建集合,
遍历它并
执行所需的操作
所有这些都在1个单一的眼睛下交易?
几个星期以来,我已经对AutoCAD. NET api了如指掌,并且做了很多漂亮的事情。
然而,我仍然觉得我有很多东西要学,有时我错过了一些关键概念。
。我发现网络特定留档非常肤浅。
我会在10小时内报告我的发现!
谢谢您的指导!
回复

使用道具 举报

5

主题

27

帖子

12

银币

初来乍到

Rank: 1

铜币
36
发表于 2013-9-3 17:26:45 | 显示全部楼层
如果您喜欢维护每个函数事务,那么您需要将子例程调用包装在事务中以保持对象打开或传递ObjectIds。如果绝对需要事务,我喜欢使用子例程中的顶部事务:
Function main()
...
使用Transaction tr=db.TransactionManager.StartTransaction()
Dim DbObjectCollection block=get_blocks(db)
sort_blocks(block)
...
结束使用
End Function
Functionget_Blocks(db As Database)As DbObjectCollection
Dim Transaction tr=db.TransactionManager.TopTransaction
如果tr==null然后抛出新的ArgumentNullException(“在事务范围之外调用的函数”)
...获取块
结束函数
回复

使用道具 举报

5

主题

27

帖子

12

银币

初来乍到

Rank: 1

铜币
36
发表于 2013-9-3 18:55:51 | 显示全部楼层
看起来很快,很难理解,但看不到您的InsertBlock函数是如何工作的。
看起来您创建并将其添加到事务中,然后提交将关闭对象的事务,然后返回块引用,并且看不到它在嵌套事务中要将其传递给。
回复

使用道具 举报

5

主题

27

帖子

12

银币

初来乍到

Rank: 1

铜币
36
发表于 2013-9-4 00:49:30 | 显示全部楼层
如果您通过Ref而不是Val传递block引用会发生什么?
回复

使用道具 举报

5

主题

27

帖子

12

银币

初来乍到

Rank: 1

铜币
36
发表于 2013-9-4 02:16:27 | 显示全部楼层

我知道,因为我从未意识到这会是个问题
每次需要挖掘时,我都使用一个单独的*新*事务。(插入实体、编辑块、移动对象)
实际上,我在代码中编写的每个方法都有自己的事务
我非常理解结束一笔交易会给后续业务带来什么样的问题
将使用此方法
在我的辩护中,或者在我的代码中:一切都按照设计的方式工作
如果不是因为那次检查(.IsDynamic)一直失败,我永远也不会更聪明
所有其他功能都已实际运行(插入、属性、转换和擦除“常规”块)
我现在将讨论它,并将向您汇报
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-5 07:51 , Processed in 0.167017 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表