| | |  | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | | |  | Von Digital Twins bis Hochleistungs-Computing: PNY präsentiert seine Zukunftstechnologien für die Industrie von morgen, eine Pressemitteilung
|
|
Autor
|
Thema: eine Frage zum Transaction Manager (1855 mal gelesen)
|
fuchsi Mitglied Programmierer c#.net Datawarehouse
   
 Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 26. Mrz. 2009 08:44 <-- editieren / zitieren --> Unities abgeben:         
den habe ich nicht ganz durchblickt. Wenn ich z.B.: an einen Block 2 Attribute anhängen möchte, muss ichd en Transaction Manager aber trotzdem nur einmal starten ? Database tDataBase = HostApplicationServices.WorkingDatabase; Transaction tTransactionManager = tDataBase.TransactionManager.StartTransaction(); .... .... angenommen ich habe eine Blockreference (z.B.: aus einem Selecteiobnset .... BlockReference tBlockReference = (BlockReference)tTransactionManager.GetObject(tBlockId,OpenMode.ForWrite); AttributeCollection tAttributCollection = tBlockReference .AttributeCollection;
AttributeReference tAttReference1 = new AttributeReference(); tAttReference1.Position = new Point3d(0, 0, 0); tAttReference1.Tag = "tag1"; tAttReference1.TextString="text1"; tAttributCollection .AppendAttribute(tAttReference1); tTransavtionManager .AddNewlyCreatedDBObject(tAttReference1, true); AttributeReference tAttReference2 = new AttributeReference(); tAttReference2.Position = new Point3d(0, 10, 0); tAttReference2.Tag = "tag2"; tAttReference2.TextString="text2"; tAttributCollection .AppendAttribute(tAttReference2); tTransavtionManager .AddNewlyCreatedDBObject(tAttReference2, true); tTransavtionManager.dispose(); Liege ich da soweit richtig ?? [Diese Nachricht wurde von fuchsi am 26. Mrz. 2009 editiert.] [Diese Nachricht wurde von fuchsi am 26. Mrz. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 26. Mrz. 2009 09:02 <-- editieren / zitieren -->
Hi, ...den TransActionManager kannst Du gar nicht starten, der ist einfach da Zum 'TransActionManager.StartTransaction':
Transactions dienen einerseits Beschleunigung der Bearbeitung von Auszügen aus großen Datenmengen und andererseits der RollBack-Möglichkeit, gleiche Konzepte wie in AutoCAD findest Du in jeder (halbwegs tauglichen) Datenbank. Die Vorgehensweise sieht dann im Prinzip so aus: - Du startest eine TransAction - Du holst Dir ein Objekt zum Schreibzugriff AutoCAD sperrt damit das Element in der Basisdatenbank, holt ein Abbild des Elements in einen Buffer-Bereich - Du bearbeitest das Element AutoCAD modifiziert das Element im Buffer - Du machst das mit weiteren Elementen AutoCAD holt diese in den gleichen Buffer und modifiziert diese dort - und jetzt die Entscheidung TransAction.Commit oder nicht Commit: jetzt werden die Modifikationen im Buffer in der echten Datenbank durchgeführt, in vielen Fällen, weil schneller, wird das originale Element einfach vertschüsst und das Buffer-Element in die eigentliche DB transferiert (Handles werden dabei ausgetauscht, damit Referenzierungen erhalten bleiben kein Commit: der Buffer wird einfach vertschuesst, der Lock des gesperrten Elements aufgehoben hoffe es kommt verständlich rüber, - alfred - ------------------ www.hollaus.at |
fuchsi Mitglied Programmierer c#.net Datawarehouse
   
 Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 26. Mrz. 2009 09:15 <-- editieren / zitieren --> Unities abgeben:         
OK Danke, super und einfach erklärt. Selbst fü einen DAU wie mir. Also mein Code würde so nicht funktionieren, da ich das COMMIT nicht durchgeführt habe. jetzt sieht man des öfters bei diesen Vorgehensweise, dass viele hier ein try catch finally einbauen. Ich nehme mal an, dass der TransactionManager auch im Fehlerfall ordentlich beendet werden muss (damit die Db Sperre aufgehoben wird) Wäre also eher dies hier die richtige VBorgehensweise ?? try { BlockReference tBlockReference = (BlockReference)tTransactionManager.GetObject(tBlockId,OpenMode.ForWrite);
AttributeCollection tAttributCollection = tBlockReference .AttributeCollection;
AttributeReference tAttReference1 = new AttributeReference(); tAttReference1.Position = new Point3d(0, 0, 0); tAttReference1.Tag = "tag1"; tAttReference1.TextString="text1"; tAttributCollection .AppendAttribute(tAttReference1); tTransavtionManager .AddNewlyCreatedDBObject(tAttReference1, true); AttributeReference tAttReference2 = new AttributeReference(); tAttReference2.Position = new Point3d(0, 10, 0); tAttReference2.Tag = "tag2"; tAttReference2.TextString="text2"; tAttributCollection .AppendAttribute(tAttReference2); tTransavtionManager .AddNewlyCreatedDBObject(tAttReference2, true); tTransactionManager.commit(); } catch (Autodesk.AutoCAD.Runtime.Exception ex) { ed.WriteMessage(("Exception: " + ex.Message)); } finally { tTransavtionManager.Dispose(); } Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 26. Mrz. 2009 09:40 <-- editieren / zitieren -->
Hi, die Deklarationen sehe ich hier leider nicht, aber aus der Namensbezeichnung schliesse ich, dass Du den TransActionManager (und nicht die TransAction) mit .Dispose 'aus dem Memory entlässt', das ist falsch! Der TransActionManager ist Bestandteil des Documents/der Database des Documents, vereinfacht ausgedrückt: den brauchst Du ja später noch um ev. eine neue TransAction zu starten. Noch aggressiver ausgedrückt: Du zerstörst (.Dispose) etwas von Deinem Document, Autodesk fängt das zwar ab, aber Du bewegst Dich auf 'lockerem Terrain'. Meine Vorgehensweise ist:
Code: Dim tTrAct as DatabaseServices.TransAction = Nothing Try tTrAct = AcadDoc.TransActionManager.StartTransAction '....hier kommen jetzt Deine Datenbankmodifikationen 'und wenn bis hier alles richtig gelaufen ist tTrAct.Commit catch ex as Exception 'da kommt Fehlerprotokolleintrag, Fehlermeldung, ... Finally if tTrAct isnot Nothing then tTrAct.Dispose:tTrAct = Nothing End Try
- alfred - ------------------ www.hollaus.at |
fuchsi Mitglied Programmierer c#.net Datawarehouse
   
 Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 26. Mrz. 2009 09:47 <-- editieren / zitieren --> Unities abgeben:         
Nein den Original TransactionManager zerstöre ich natürlich nicht. Database tDataBase = HostApplicationServices.WorkingDatabase; Transaction tTransactionManager ; Try { tTransactionManager = tDataBase.TransactionManager.StartTransaction(); .... tTransactionManager.commit(); } catch (Autodesk.AutoCAD.Runtime.Exception ex) { } finally { tTransactionManager.dispose(); }
[Diese Nachricht wurde von fuchsi am 26. Mrz. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 26. Mrz. 2009 09:53 <-- editieren / zitieren -->
na dann hab ich mich von der Variablenbenennung täuschen lassen, - alfred - ------------------ www.hollaus.at |

| |
RoSiNiNo Mitglied Konstrukteur
   
 Beiträge: 1126 Registriert: 09.10.2002 Revit Structure 2011 Acad 2011-deutsch, Express Tools 3ds Max 2011 Win 7-Professional HP Workstation Z400, 6GB GeForce GTX 470
|
erstellt am: 31. Mrz. 2009 13:56 <-- editieren / zitieren --> Unities abgeben:          Nur für fuchsi
Wäre das nicht noch besser Code: using(tTransactionManager = tDataBase.TransactionManager.StartTransaction()) { //Dein Code tTransactionManager.Commit(); }
tTransactionManager.dispose(); ersparst du dir in diesem Fall, soweit ich es verstanden habe. ------------------ Roland Feletic PAUSER ZT-GMBH Acad 2009-deutsch Update 2, Express Tools, Bonus Pack 2 3ds Max 2009 - SP1 WinXP-Professional HP Workstation xw4400, 3GB Quadro FX1500 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
 |