乐筑天下

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

求教:希望实现递归打印数据字典内容,程序出错。还请高手指点一二。

[复制链接]

4

主题

8

帖子

2

银币

初来乍到

Rank: 1

铜币
24
发表于 2011-4-23 18:32:00 | 显示全部楼层 |阅读模式
public class testNod
    {
        Database db = HostApplicationServices.WorkingDatabase;
        Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
        [CommandMethod("tess")]        
        public void Test()
        {
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                ObjectId nodId = db.NamedObjectsDictionaryId;
                nodeSearch(nodId);
                trans.Commit();
            }
        }
        private void nodeSearch(ObjectId nodId)
        {
            Transaction trans = db.TransactionManager.StartTransaction();
            DBDictionary nod = (DBDictionary)trans.GetObject(nodId, OpenMode.ForWrite);
            DbDictionaryEnumerator dictEnum = nod.GetEnumerator();
            ObjectId objId = new ObjectId();
            
            while (dictEnum.MoveNext())
            {
                objId = dictEnum.Value;
                string objName = dictEnum.Key;
                ed.WriteMessage("\n" + objId.ToString() + "   " + objName);
                if (trans.GetObject(nodId, OpenMode.ForWrite) is DBDictionary)
                {
                    nodeSearch(objId);
                }
                else
                {
                    break;
                }
            }
        }
    }
回复

使用道具 举报

4

主题

8

帖子

2

银币

初来乍到

Rank: 1

铜币
24
发表于 2011-4-24 00:46:00 | 显示全部楼层

我调试好的代码。 还有两点不明请大家指教。
1.未调用trans.commit为何不发生错误,什么时候需要调用commit什么时候不需要。
2.是否有高手为小弟对trans实现机制稍作指点。
public class testNod
    {
        Database db = HostApplicationServices.WorkingDatabase;
        Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
        [CommandMethod("tess")]        
        public void Test()
        {
                ObjectId nodId = db.NamedObjectsDictionaryId;
                nodeSearch(nodId);
        }
        private void nodeSearch(ObjectId nodId)
        {
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                DBDictionary nod = trans.GetObject(nodId, OpenMode.ForWrite) as DBDictionary;
                if (nod != null)
                {
                    DbDictionaryEnumerator dictEnum = nod.GetEnumerator();
                    ObjectId objId = new ObjectId();
                    while (dictEnum.MoveNext())
                    {
                        objId = dictEnum.Value;
                        string objName = dictEnum.Key;
                        ed.WriteMessage("\n" + objId.ToString() + "   " + objName);
                        nodeSearch(objId);
                    }
                }
            }
        }
    }
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2011-4-24 09:02:00 | 显示全部楼层

1,数据词典DBDictionary里面的可能是词典DBDictionary,也可能是扩展记录Xrecord
2,我也不大明白"什么时候需要调用commit什么时候不需要",我简单理解为只读不需要,写入则需要
(后注:这里回的是二楼)
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2011-4-24 09:07:00 | 显示全部楼层

  private void nodeSearch(ObjectId nodId)
        {
            DBDictionary nod = (DBDictionary)trans.GetObject(nodId, OpenMode.ForWrite);
                if (trans.GetObject(nodId, OpenMode.ForWrite) is DBDictionary)
                {
                    nodeSearch(objId);
                }
-------------------------------
1,这里怀疑变量写错了,if (trans.GetObject(nodId, OpenMode.ForWrite) is DBDictionary) 实是想写if (trans.GetObject(objId, OpenMode.ForWrite) is DBDictionary)
2,不管是objId 还是 nodId,你都重复打开了
(后注:这里回的是一楼,回二楼时没有看到一楼)
回复

使用道具 举报

8

主题

138

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
170
发表于 2011-4-24 16:49:00 | 显示全部楼层

.commit() 和.abort两个是对应的commit表示事务所有在commit之前的操作都被存储,而.abort则表示回滚,放弃前面所有对数据库的操作,因此没有需要在数据库中存储的操作时就不需要.commit()
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-6-29 12:23 , Processed in 1.559910 second(s), 62 queries .

© 2020-2025 乐筑天下

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