arcgis 编辑时独占mdb

在用arcmap同时编辑一个mdb时会出现错误信息“数据源已锁定”。gdb亦如此,见:http://www.gisall.com/html/32/7232-2744.html

那么在ae中具体是个什么情况呢,我以mdb为数据源来测试

1、对于单线程同时编辑的情况,打开一个workspace,对这个workspace做1000次开始编辑操作,而不结束编辑,不会出现错误

            IWorkspaceFactory wf = new AccessWorkspaceFactoryClass();
            IWorkspace ws = wf.OpenFromFile(filePath, 0);
            for (int i = 0; i < 1000; i++)
            {
                IWorkspaceEdit we = ws as IWorkspaceEdit;
                we.StartEditing(false);
                we.StartEditOperation();
            }
如果打开1000次workspace,并开始编辑,而不结束编辑操作,也不会出现错误
            for (int i = 0; i < 1000; i++)
            {
                IWorkspaceFactory wf = new AccessWorkspaceFactoryClass();
                IWorkspace ws = wf.OpenFromFile(filePath, 0);
                IWorkspaceEdit we = ws as IWorkspaceEdit;
                we.StartEditing(false);
                we.StartEditOperation();
            }
2、多线程同时编辑的情况,在100个线程里打开100次workspace,并开始编辑,而不结束编辑,也不会出错
            ThreadStart ts = delegate()
            {
                try
                {
                    IWorkspaceFactory wf = new AccessWorkspaceFactoryClass();
                    IWorkspace ws = wf.OpenFromFile(filePath, 0);
                    IWorkspaceEdit we = ws as IWorkspaceEdit;
                    we.StartEditing(false);
                    we.StartEditOperation();
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            };
            for (int j = 0; j < 100; j++)
            {
                Thread t1 = new Thread(ts);
                t1.Start();
            }
3、多进程同时编辑的情况,在2个进程里打开workspace,并开始编辑,而不结束编辑,在第二个进程开始编辑的时候得到一个COMException的异常,
描述为:“无法锁定数据表GDB_DatabaseLocks;正被机器 '机器名' 上的用户 '用户名' 使用。”。而如果第一个进程开始编辑后结束编辑,第二个进程再开始编辑,是不会出错的。
所以,ae的编辑锁(不知道叫啥名,乱取的)是针对进程,而且是针对同时编辑的情况。
无论ae还是arcgis在开始编辑一个mdb后,通过office access软件是可以查看被编辑mdb的除GDB_DatabaseLocks以外的所有表的,查看GDB_DatabaseLocks表就会提示被独占方式打开。
奇怪的是,即使是在开始编辑以锁定GDB_DatabaseLocks表的ae程序进程里,通过OleDb查询或用IFeatureWorkspace的OpentTable方法都会得到被独占的异常。代码如下:
            IWorkspaceFactory wf = new AccessWorkspaceFactoryClass();
            IWorkspace ws = wf.OpenFromFile(filePath, 0);
            IWorkspaceEdit we = ws as IWorkspaceEdit;
            we.StartEditing(false);
            we.StartEditOperation();
            ITable temT = ((IFeatureWorkspace)ws).OpenTable("GDB_DatabaseLocks");
posted on 2011-09-15 15:31  漫步人生  阅读(3084)  评论(0编辑  收藏  举报