Codeausschnitt: Bestimmen fehlerhafter externer Elemente und Beheben der Fehler im BCS-Clientcache
Letzte Änderung: Donnerstag, 13. Mai 2010
Gilt für: SharePoint Server 2010
Inhalt dieses Artikels
Beschreibung
Voraussetzungen
So verwenden Sie dieses Beispiel
Im folgenden Beispiel wird veranschaulicht, wie Sie überprüfen, ob für die externen Elemente eines Abonnements im Business-Konnektivitätsdienste (Business Connectivity Services)-Clientcache fehlerhafte Vorgänge vorhanden sind, und wie Sie die Fehler bei den externen Elemente beheben.
Installation von Microsoft SharePoint Server 2010 oder Microsoft SharePoint Foundation 2010 auf dem Server
Installation von Microsoft .NET Framework 3.5 auf dem Clientcomputer
Microsoft Visual Studio
Mindestens ein Abonnement im Business-Konnektivitätsdienste (Business Connectivity Services)-Clientcache
Starten Sie Visual Studio auf dem Clientcomputer, und erstellen Sie dann ein neues C#-Microsoft Office-Anwendungs-Add-In-Projekt. Wählen Sie beim Erstellen des Projekts .NET Framework 3.5 aus.
Klicken Sie im Menü Ansicht auf Eigenschaftenseiten, um die Projekteigenschaften aufzurufen.
Wählen Sie auf der Registerkarte Erstellen unter Zielplattform die Option Any CPU aus.
Schließen Sie das Fenster mit den Projekteigenschaften.
Entfernen Sie im Projektmappen-Explorer unter Verweise sämtliche Projektverweise bis auf System und System.Core.
Fügen Sie dem Projekt die folgenden Verweise hinzu:
Microsoft.Office.BusinessApplications.Runtime
Microsoft.BusinessData
Ersetzen Sie die vorhandenen using-Anweisungen durch folgende Anweisungen:
using System; using Microsoft.BusinessData.Offlining; using Microsoft.Office.BusinessData.Offlining; using System.Windows.Forms;
Rufen Sie im Startereignis des Add-Ins die beiden am Ende dieser Prozedur definierten Methoden auf.
Ersetzen Sie die Platzhalterwerte von <entityNamespace>, <entityName>, <viewName> und <subscriptionName> durch gültige Werte.
Speichern Sie das Projekt.
Kompilieren Sie das Projekt, und führen Sie es aus.
Dadurch wird die Office-Anwendung geöffnet und der folgende Code ausgeführt.
// 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()