AutoCAD属性无法更新求助:代码触发但修改未提交到数据库
解决AutoCAD属性无法更新的问题
看起来你遇到的核心问题是事务未提交,再加上代码里几个细节处理不到位,导致修改没能持久化到数据库里。我帮你梳理下关键问题和修正方案:
关键问题分析
- 事务未提交:AutoCAD的
Transaction必须调用Commit()才能把修改写入数据库,你的代码只启动了事务但没执行提交操作,这是最核心的原因。 - 过早调用
CloseInput(true):这个方法会关闭DWG文件的输入流,要是在修改操作前就调用它,后续的写入动作很可能无法正常执行。 - 对象打开模式错误:要修改BlockTableRecord或属性,必须以
OpenMode.ForWrite模式打开对象,仅用ForRead权限是没法修改内容的。
修正后的代码示例
string fileName = "你的DWG文件路径"; using (Database db = new Database(false, true)) { // 读取DWG文件,不要过早关闭输入流 db.ReadDwgFile(fileName, System.IO.FileShare.ReadWrite, false, ""); using (Transaction tr = db.TransactionManager.StartTransaction()) { // 以读模式打开块表 BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; // 遍历块表,定位到目标块(示例中跳过匿名块和布局块) foreach (ObjectId btrId in bt) { BlockTableRecord btr = tr.GetObject(btrId, OpenMode.ForRead) as BlockTableRecord; if (btr.IsAnonymous || btr.IsLayout) continue; // 切换为写模式以修改块内内容 btr.UpgradeOpen(); // 遍历块内实体,找到属性引用 foreach (ObjectId entId in btr) { Entity ent = tr.GetObject(entId, OpenMode.ForRead) as Entity; if (ent is AttributeReference attRef) { // 切换属性为写模式 attRef.UpgradeOpen(); // 这里放入你的case逻辑,修改属性值 switch (attRef.Tag) { case "TARGET_TAG": attRef.TextString = "更新后的属性值"; // 修改完成后降级为读模式,释放写锁 attRef.DowngradeOpen(); break; } } } btr.DowngradeOpen(); } // 提交事务!这一步绝对不能省略 tr.Commit(); } // 最后保存修改并关闭输入流 db.SaveAs(fileName, DwgVersion.Current); db.CloseInput(true); }
额外注意事项
- 文件共享权限:如果要修改文件,
ReadDwgFile的FileShare参数要设为ReadWrite,用Read会导致文件被锁定无法写入。 - 对象权限管理:修改完对象后调用
DowngradeOpen()释放写锁,避免和其他操作产生权限冲突。 - 属性类型区分:要注意
AttributeDefinition(属性定义)和AttributeReference(插入块后的属性实例)的区别,通常我们需要修改的是后者。
内容的提问来源于stack exchange,提问作者Stuart Brant
相关产品推荐
相关产品推荐

