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