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");

你可能感兴趣的:(arcgis)