Freigeben über


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

Beschreibung

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.

Voraussetzungen

  • 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

So verwenden Sie dieses Beispiel

  1. 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.

  2. Klicken Sie im Menü Ansicht auf Eigenschaftenseiten, um die Projekteigenschaften aufzurufen.

  3. Wählen Sie auf der Registerkarte Erstellen unter Zielplattform die Option Any CPU aus.

  4. Schließen Sie das Fenster mit den Projekteigenschaften.

  5. Entfernen Sie im Projektmappen-Explorer unter Verweise sämtliche Projektverweise bis auf System und System.Core.

  6. Fügen Sie dem Projekt die folgenden Verweise hinzu:

    1. Microsoft.Office.BusinessApplications.Runtime

    2. Microsoft.BusinessData

  7. Ersetzen Sie die vorhandenen using-Anweisungen durch folgende Anweisungen:

    using System;
    using Microsoft.BusinessData.Offlining;
    using Microsoft.Office.BusinessData.Offlining;
    using System.Windows.Forms;
    
  8. Rufen Sie im Startereignis des Add-Ins die beiden am Ende dieser Prozedur definierten Methoden auf.

  9. Ersetzen Sie die Platzhalterwerte von <entityNamespace>, <entityName>, <viewName> und <subscriptionName> durch gültige Werte.

  10. Speichern Sie das Projekt.

  11. 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;
                    }
                }
            }
        }

Siehe auch

Referenz

RemoteOfflineRuntime

GetSynchronizationManager()

GetMetadataCatalog()

IMetadataCatalog

GetEntity(String, String)

IEntity

GetSpecificFinderView(String)

IView

GetAllInstancesInError(IView)

IEntityInstance

IOfflineEntityInstance

SynchronizationStatus

CancelAllInstanceOperations()

GetFailedOperation()

GetConflictData([])

ConflictData

GetAllOperationsInError()

IOperationCollection

IOperation