ArcEngine註冊版本編輯sde中的資料(解決報錯0x80040356)

冉總發表於2020-09-28

1、問題提出

在我的上一篇博文中(ArcGIS編輯SDE的向量資料(集)(解決因版本化問題不能編輯))解決了在ArcGIS中編輯sde時遇到的未註冊導致不能編輯的問題,同樣,在ArcEngine中也可以用同樣的思路解決這個問題。這個問題比較簡單,所以為了增加篇幅,我在這篇博文中整理了一下我解決ArcEngine問題的一貫思路,如果比較趕時間可以跳過第二部分。

2、解決思路

我始終堅信遇到問題最好的解決辦法第一是幫助文件,第二是百度谷歌,所以在已經知道在ArcGIS中如何解決這個問題之後就可以在幫助文件中查詢相關內容,我們在幫助文件中搜尋“RegisterAsVersioned”,得到了下圖的結果:
搜尋結果

這就可以知道我們應該呼叫“IVersionedObject”介面,按照ArcGIS的一貫做法,當然是呼叫最新的介面IVersionedObject3。

接下來我們把目光轉移到物件模型圖(安裝ao的路徑下找),這個介面是在ESRI.ArcGIS.Geodatabase名稱空間下,所以可以開啟“GeoDatabaseObjectModel”,搜尋IVersionedObject3,得到這個介面是在這裡,這是個抽象類:
物件模型圖
所以我們可以這樣去實現它:

IVersionedObject3 versionedObject = pDataSet as IVersionedObject3;

接下來的步驟就和在arcgis中實現基本上一樣了。

3、程式碼實現:

網上我找了很多資料,這些程式碼大多隻是將編輯的模式設定未版本化模式,但是並沒有說怎樣進行版本化,所以,首先先判斷這個資料集是否已經註冊了版本,如果註冊了版本就直接設定編輯模式未版本化編輯,否則,就需要先註冊版本再編輯。按照這個邏輯,程式碼就應該是這樣的:

                if (pWorkspace.Type == esriWorkspaceType.esriRemoteDatabaseWorkspace)
                {
                    IVersionedObject3 versionedObject = pDataSet as IVersionedObject3;
                    //註冊版本
                    if (versionedObject != null && !versionedObject.IsRegisteredAsVersioned)
                    {
                        versionedObject.RegisterAsVersioned(true);
                    }
                    pEngineEditor.EditSessionMode = esriEngineEditSessionMode.esriEngineEditSessionModeVersioned;
                }
                //else
                //{
                //    pEngineEditor.EditSessionMode = esriEngineEditSessionMode.esriEngineEditSessionModeNonVersioned;
                //}
                //設定編輯任務
                pEngineEditor.StartEditing(pWorkspace, pMap);

如果對沒有註冊版本的sde資料集搶行進行編輯操作,那麼就會報錯:HRESULT:0x80040356

相關文章