AE多用戶同時編輯同一個版本數據的解決方法

項目中作了入庫的功能,測試一切正常,可是實際使用多個用戶同時編輯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 filesspa

修改方法有三種:.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

3. http://gis.stackexchange.com/questions/77299/why-unable-to-edit-arcsde-from-multiple-computers-on-lan-using-custom-arcgis-eng

4. http://www.docin.com/p-458035218.html

5. http://blog.163.com/geliang0021@126/blog/static/3232232920121171127582/

6. http://blog.csdn.net/linghe301/article/details/8072907

相關文章
相關標籤/搜索