項目中作了入庫的功能,測試一切正常,可是實際使用多個用戶同時編輯default版本的時候,問題就來了,StopEditing 錯誤信息以下html
FDO_E_VERSION_REDEFINED | -2147217147 | The version has been redefined to reference a new database state. |
字面意思理解,保存的時候,版本狀態已經被重定義了;也就是說保存以前沒有協調到最新的版本狀態。java
AE開發,arcmap是最好的老師,先看看arcmap是怎麼處理這種狀況的吧。在本機打開兩個arcmap,模擬同時編輯的狀況,第一次保存的一切正常,第二次保存的就會報錯了,錯誤信息以下:web
Unable to create logfile system tables. User perhaps lacks permissions or resources to create tables數據庫
1、設置SDE相關測試
通過查詢得知,是須要修改日誌文件(基於會話的日誌文件 Session log files)spa
修改方法有三種:.net
1,經過sdeconfig -o alter 日誌
2, 經過sdeconfig -o export importcode
3, 直接打開數據庫表修改 server
修改內容 ALLOWSESSIONLOGFILE=TRUE;LOGFILEPOOLSIZE=20;具體修改方法,可參考引用文章1。
Insufficient permissions <-25> 若是發現這個錯誤,那麼是你修改的時候使用的用戶沒有權限,你只有用sde用戶才能修改server_config。
經過修改,如今arcmap中已是能夠多用戶同時編輯了,若是有衝突,會有衝突列表提示;若是內容合併,默認也會有合併提示,人工肯定後,能夠保存。
若是在arcmap中不但願彈出提示信息,能夠在編輯選項中設置,設置方法,參見引用文章2
2、代碼實現
IVersionEdit.Reconcile Method ,用了協調版本之間的差別,直接使用,發如今多用戶編輯的要素都不相同的時候,是能夠正常協調的,可是若是編輯的是相同的要素,則沒法檢測到衝突。IVersionEdit4.Reconcile4 Method 這個方法一樣也不行,而後繼續搜索資料,根據引用文章3的方法,使用IMultiuserWorkspaceEdit.StartMultiuserEditing Method;使用該接口,能夠正常協調合並,使用方法見引用文章4
主要代碼
IMultiuserWorkspaceEditPtr ipMultiuserWorkspaceEdit; hr = ipMultiuserWorkspaceEdit->StartMultiuserEditing(esriMESMVersioned); //編輯。。。 ipWorkspaceEdit->StartEditOperation(); //........ ipWorkspaceEdit->StopEditOperation(); //必須在StopEditOperation後調用,不然會丟失編輯內容 IVersionedWorkspacePtr ipVersionedWorkspace = (IVersionedWorkspacePtr)ipWorkspaceEdit; IVersionPtr ipVersion; hr = ipVersionedWorkspace->get_DefaultVersion(&ipVersion); BSTR bVersionName=NULL; hr = ipVersion->get_VersionName(&bVersionName); IVersionEdit4Ptr ipVersionEdit4 = (IVersionEdit4Ptr)ipWorkspaceEdit; VARIANT_BOOL vbReconcile; hr = ipVersionEdit4->Reconcile4(bVersionName,VARIANT_TRUE,VARIANT_FALSE,VARIANT_TRUE,VARIANT_TRUE,&vbReconcile); if (VARIANT_TRUE == vbReconcile) { SHOW_MESSAGE_BOX(_T("檢測到編輯衝突,請稍後再試")); return FALSE; } VARIANT_BOOL vbCanPost; hr = ipVersionEdit4->CanPost(&vbCanPost); if (VARIANT_TRUE == vbCanPost) { hr = ipVersionEdit4->Post(bVersionName); } hr = ipWorkspaceEdit->StopEditing(VARIANT_TRUE);
關於該部分的詳細解釋,能夠參考引用文章5
PS:關於日誌表詳細介紹,能夠查看引用文章6
參考文章
1. http://www.cnblogs.com/cannel/archive/2011/03/15/1985493.html
2. http://webhelp.esri.com/arcgisserver/9.3/java/index.htm#geodatabases/an_overv-60074501.htm
4. http://www.docin.com/p-458035218.html
5. http://blog.163.com/geliang0021@126/blog/static/3232232920121171127582/