コード スニペット: BCS クライアント キャッシュでエラーがある外部アイテムを判定して解決する

最終更新日: 2010年5月13日

適用対象: SharePoint Server 2010

この記事の内容
説明
前提条件
この例を使用するには

説明

以下の例は、Business Connectivity Services クライアント キャッシュ内のサブスクリプションの外部アイテムごとに失敗した操作がないかどうかを確認する方法、およびエラーが発生した外部アイテムを解決する方法を示しています。

前提条件

  • サーバーにインストールされた Microsoft SharePoint Server 2010 あるいは Microsoft SharePoint Foundation 2010

  • クライアント コンピューターにインストールされた Microsoft .NET Framework 3.5

  • Microsoft Visual Studio

  • Business Connectivity Services クライアント キャッシュでの少なくとも 1 つのサブスクリプション

この例を使用するには

  1. クライアント コンピューターで Visual Studio を開始し、次に新しい C# Microsoft Office アプリケーション アドイン プロジェクトを作成します。プロジェクトを作成するときに、[.NET Framework 3.5] を選択します。

  2. [表示] メニューから、[プロパティ ページ] を選択してプロジェクト プロパティを表示します。

  3. [ビルド] タブから、[プラットフォーム ターゲット] で、[Any CPU] を選択します。

  4. プロジェクト プロパティ ウィンドウを閉じます。

  5. [ソリューション エクスプローラー] の [参照設定] で、[System] と [System.Core] を除いて、すべてのプロジェクト参照を削除します。

  6. プロジェクトに以下の参照を追加します。

    1. Microsoft.Office.BusinessApplications.Runtime

    2. Microsoft.BusinessData

  7. 以下のステートメントで既存の using ステートメントを置換します。

    using System;
    using Microsoft.BusinessData.Offlining;
    using Microsoft.Office.BusinessData.Offlining;
    using System.Windows.Forms;
    
  8. アドインの起動イベントで、この手順の最後に定義されている 2 つのメソッドを呼び出します。

  9. 有効な値で <entityNamespace>、<entityName>、<viewName>、および <subscriptionName> のプレースホルダー値を置換します。

  10. プロジェクトを保存します。

  11. プロジェクトをコンパイルして、実行します。

    これにより、Office アプリケーションが開始して、以下のコードが実行されます。

        // Instance-level error resolution.
        public static void ResolveCustomerErrors(char inErrorAction, char inConflictAction)
        {
            //Create an instance of remote offline runtime that creates a connection to the client cache.
            using (RemoteOfflineRuntime offlining = new RemoteOfflineRuntime())
            {
                ISynchronizationManager syncManager = offlining.GetSynchronizationManager();
                IMetadataCatalog catalog = offlining.GetMetadataCatalog();                

                //1. Get the view to resolve.
                IEntity entity = catalog.GetEntity("<entityNamespace>", "<entityName>");
                IView view = entity.GetSpecificFinderView("Read Item");

                //2. Get all instances in error - and in conflict - for the view.
                IEnumerator<IEntityInstance> instancesInError =
                    syncManager.GetAllInstancesInError(view);

                while (instancesInError.MoveNext())
                {
                    IOfflineEntityInstance offlineInstance = (IOfflineEntityInstance)instancesInError.Current;

                    //3. Check to see if instance is in error.
                    if (offlineInstance.SynchronizationStatus == SynchronizationStatus.InError)
                    {
                        switch (inErrorAction)
                        {
                            case 'C':
                                //3a. Cancel all operations for the instance.
                                offlineInstance.CancelAllInstanceOperations();
                                break;
                            case 'R':
                                //3b. Retry the failed operation.
                                offlineInstance.GetFailedOperation().Retry();
                                break;
                            case 'D':
                                //3c. Delete the instance.
                                offlineInstance.Delete();
                                break;
                        }
                    }
                    //4. Check to see whether instance is in conflict.
                    else if (offlineInstance.SynchronizationStatus == SynchronizationStatus.InConflict)
                    {
                        MessageBox.Show("Instance with the following conflicts found:");

                        ConflictData[] conflicts = null;
                        offlineInstance.GetConflictData(out conflicts);
                        foreach (ConflictData conflict in conflicts)
                        {
                            MessageBox.Show(String.Format("Conflict found on field with name '{0}', full field name '{1}'. Current value is '{2}', but LOB system has '{3}'.",
                                conflict.fieldName,
                                conflict.fieldFullName,
                                conflict.currentValue,
                                conflict.authoritativeValue));
                        }

                        switch (inConflictAction)
                        {
                            case 'R':
                                //4a. Retry with local changes.
                                offlineInstance.ReplaceChanges();
                                break;
                            case 'K':
                                //4b. Revert local changes.
                                offlineInstance.CancelAllInstanceOperations();
                                break;
                        }
                    }
                }
            }
        }

        // Operation-level error resolution.
        public static void ResolveOperationErrors(char errorAction)
        {
            using (RemoteOfflineRuntime offlining = new RemoteOfflineRuntime())
            {
                ISynchronizationManager syncManager = offlining.GetSynchronizationManager();

                // Get failed operations.
                IOperationCollection failedOperations = syncManager.GetAllOperationsInError();
                foreach (IOperation operation in failedOperations)
                {
                    MessageBox.Show(String.Format("FAILED OPERATION - ActivityId: '{0}', LOBSystem: '{1}', EntityName: '{2}', LastExceptionMessage: '{3}', Last Successful Operation Execution: '{4}'",
                               operation.ActivityId.ToString(),
                               operation.LobSystemInstance.GetDefaultDisplayName(),
                               operation.Entity.GetDefaultDisplayName(),
                               operation.LastException.Message,
                               operation.LastExecuted.ToString()));                     

                    switch (errorAction)
                    {
                        case 'C':
                            // Cancel all operations for the instance.
                            operation.CancelSingleOperation();
                            break;
                        case 'R':
                            // Retry the failed operation.
                            operation.Retry();
                            break;
                    }
                }
            }
        }

関連項目

参照

RemoteOfflineRuntime

GetSynchronizationManager()

GetMetadataCatalog()

IMetadataCatalog

GetEntity(String, String)

IEntity

GetSpecificFinderView(String)

IView

GetAllInstancesInError(IView)

IEntityInstance

IOfflineEntityInstance

SynchronizationStatus

CancelAllInstanceOperations()

GetFailedOperation()

GetConflictData([])

ConflictData

GetAllOperationsInError()

IOperationCollection

IOperation