代码段:确定并解决 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. 在客户端计算机上启动 Visual Studio,然后创建新的 C# Microsoft Office 应用程序加载项项目。创建项目时选择".NET Framework 3.5"。

  2. 从"视图"菜单中选择"属性页"以显示项目属性

  3. 在"生成"选项卡上,为"目标平台"选择"任何 CPU"。

  4. 关闭项目属性窗口。

  5. 在"解决方案资源管理器"中的"引用"下,删除除 SystemSystem.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. 在外接程序的启动事件中,调用本过程末尾定义的两类方法。

  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