上次修改时间: 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 客户端缓存中至少有一个订阅
使用此示例
在客户端计算机上启动 Visual Studio,然后创建新的 C# Microsoft Office 应用程序加载项项目。创建项目时选择".NET Framework 3.5"。
从"视图"菜单中选择"属性页"以显示项目属性
在"生成"选项卡上,为"目标平台"选择"任何 CPU"。
关闭项目属性窗口。
在"解决方案资源管理器"中的"引用"下,删除除 System 和 System.Core 之外的所有项目引用。
向项目中添加以下引用:
Microsoft.Office.BusinessApplications.Runtime
Microsoft.BusinessData
用下面的语句替换现有的 using 语句:
using System; using Microsoft.BusinessData.Offlining; using Microsoft.Office.BusinessData.Offlining; using System.Windows.Forms;在外接程序的启动事件中,调用本过程末尾定义的两类方法。
将 <entityNamespace>、<entityName>、<viewName> 和 <subscriptionName> 的占位符值替换为有效的值。
保存该项目。
编译并运行该项目。
这将打开 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;
}
}
}
}