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を参照してください.
プライマリコード
このセクションの詳細な説明については、引用記事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
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