AEマルチユーザによる同一バージョンデータの同時編集の解決方法

4984 ワード

プロジェクトで入庫機能を行い、すべて正常にテストしたが、実際に複数のユーザーを使用してdefaultバージョンを同時に編集したとき、問題が発生した.StopEditingエラーメッセージは以下の通りである.
FDO_E_VERSION_REDEFINED
-2147217147
The version has been redefined to reference a new database state.
字面の意味は理解して、保存する時、バージョンの状態はすでに再定義されました;つまり、保存前に最新のバージョンステータスに調整されていません.
 
AE開発、arcmapは最高の先生で、まずarcmapがどのようにこのような状況を処理しているかを見てみましょう.本機で2つのarcmapを開き、同時に編集する場合をシミュレートし、1回目の保存はすべて正常で、2回目の保存はエラーを報告し、エラー情報は以下の通りです.
Unable to create logfile system tables. User perhaps lacks permissions or resources to create tables
一、SDE関連の設定
クエリの結果、ログファイルを変更する必要があることがわかりました(セッションベースのログファイルSessionlog files)
修正方法は3つあります.
1,sdeconfig-o alter
2,sdeconfig-o export import
3、データベーステーブルを直接開く変更
修正内容ALLOWESSIONLOGFILE=TRUE;LOGFILEPOOLSIZE=20;具体的な修正方法は、記事1を参照してください.
Insufficient permissions<-25>このエラーが見つかった場合、修正時に使用するユーザーには権限がなく、sdeユーザーでのみserver_を変更できます.config.
 
修正によりarcmapではすでに複数のユーザーが同時に編集できるようになり、衝突があれば衝突リストのヒントがあります.コンテンツがマージされた場合、デフォルトではマージのプロンプトも表示されます.手動で決定した後、保存できます.
arcmapでプロンプト情報をポップアップしたくない場合は、編集オプションで設定、設定方法を参照してください.
 
二、コード実装
IVersionEdit.Reconcile Methodは、コーディネータバージョン間の差異を用いてそのまま使用していますが、マルチユーザ編集の要素が異なる場合は、正常にコーディネータできることがわかりますが、同じ要素を編集している場合は、競合は検出されません.IVersionEdit4.Reconcile 4 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