Exemple : fournisseur de table virtuelle personnalisée avec opérations CRUD

Cet exemple montre comment implémenter un fournisseur de données personnalisé pour créer une table virtuelle qui prend en charge les opérations de création, de récupération, de mise à jour et de suppression. Pour chacune de ces opérations, vous implémentez un plug-in générique, vous les enregistrez à l’aide de l’outil d’enregistrement de plug-in et activez les sources de données de table virtuelle pour créer la table virtuelle.

Pour en savoir plus sur les fournisseurs de données et le développement de plug-ins, consultez Fournisseurs de données personnalisées

Détails sur la source de données

Dans cette procédure pas à pas, vous allez configurer une table simple dans un serveur SQL externe pour créer une table virtuelle. Le nom de table utilisé dans cet exemple est VETicket.

Notes

Mettez à jour votre code de plug-in, si vous souhaitez modifier le nom de la table ou des colonnes.

Nom de colonne Type de données Objectif
TicketID Identificateur unique ou Clé primaire Clé primaire de la table.
Gravité Integer Valeur de gravité du ticket.
Nom String Description du ticket.

Il existe quatre étapes pour permettre à un fournisseur de données personnalisé de créer une table virtuelle.

Étape 1 : implémentation des plug-ins CRUD et enregistrement de l’assembly

Étape 2 : Création du fournisseur de données et ajout de plug-ins au fournisseur

Étape 3 : Création d’une table virtuelle dans l’environnement Dataverse

Étape 4 : Créer, mettre à jour, afficher et supprimer des enregistrements à l’aide d’une table virtuelle

Étape 1 : implémentation des plug-ins CRUD et enregistrement de l’assembly

  1. Créez votre projet de plug-in et installez les paquets NuGet suivants. La solution dans cet exemple est nommée StubProvider.

    Assemblage URL
    Microsoft.CrmSdk.CoreAssemblies https://www.nuget.org/packages/Microsoft.CrmSdk.CoreAssemblies
    Microsoft.CrmSdk.Data https://www.nuget.org/packages/Microsoft.CrmSdk.Data
    Microsoft.CrmSdk.Deployment https://www.nuget.org/packages/Microsoft.CrmSdk.Deployment
    Microsoft.CrmSdk.Workflow https://www.nuget.org/packages/Microsoft.CrmSdk.Workflow
    Microsoft.CrmSdk.XrmTooling.CoreAssembly https://www.nuget.org/packages/Microsoft.CrmSdk.XrmTooling.CoreAssembly
    Microsoft.IdentityModel.Clients.ActiveDirectory https://www.nuget.org/packages/Microsoft.IdentityModel.Clients.ActiveDirectory
    Microsoft.Rest.ClientRuntime https://www.nuget.org/packages/Microsoft.Rest.ClientRuntime
    Newtonsoft.Json https://www.nuget.org/packages/Newtonsoft.Json/13.0.1-beta2
  2. Ajoutez les six fichiers de classe suivants à votre solution. Dans chacun des fichiers de classe, ajoutez ce qui suite à l’aide des instructions

    using System; 
    using System.Collections.Generic; 
    using System.Data.SqlClient; 
    using System.Linq; using System.Text; 
    using System.Threading.Tasks; 
    using Microsoft.Xrm.Sdk; 
    using Microsoft.Xrm.Sdk.Extensions; 
    using Microsoft.Xrm.Sdk.Data.Exceptions; 
    using Newtonsoft.Json; 
    

    Notes

    Dans chacun de ces fichiers de classe, mettez à jour le nom de la table pour qu’il corresponde au nom de la table source que vous avez configuré. Le nom de table utilise VETicket comme nom de table source.

    Nom du fichier de classe Objectif
    Connection.cs Cette classe contient du code pour créer et gérer la connexion au SQL externe source de données. Il comprend les paramètres de chaîne de connexion spécifiques à la base de données externe et les informations d’authentification SQL requises pour établir la connexion. Remplacez les valeurs respectives de votre : serveur de base de données, ID utilisateur, mot de passe et nom de table dans lequel vous allez créer une table virtuelle Dataverse.
    CreatePlugin.cs Cette classe contient du code qui gère l’opération de création de la table virtuelle.
    UpdatePlugin.cs Cette classe contient du code qui gère la mise à jour des enregistrements dans la table virtuelle.
    RetrievePlugin.cs Cette classe contient du code qui récupère un enregistrement spécifique de la table virtuelle.
    RetrieveMultiplePlugin.cs Cette classe contient du code pour récupérer plusieurs enregistrements de la table virtuelle.
    DeletePlugin.cs Cette classe contient du code qui vous permet de supprimer un enregistrement dans la table virtuelle.

    Code pour Connection.cs

     public static class Connection
    {
       public static SqlConnection GetConnection()
       {
           try
           {
               //sample database to connect to 
               SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
               builder.DataSource = "Enter name or network address of the SQL Server";
               builder.UserID = "Enter User Name";
               builder.Password = "Enter password";
               builder.InitialCatalog = "Enter database details";
               SqlConnection connection = new SqlConnection(builder.ConnectionString);
               return connection;
           }
           catch (SqlException e)
           {
               Console.WriteLine(e.ToString());
               throw;
           }
       }
    }
    

    Code pour CreatePlugin.cs

    public class CreatePlugin : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            var context = serviceProvider.Get<IPluginExecutionContext>();
            if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
            {
                Entity entity = (Entity)context.InputParameters["Target"];
                Guid id = Guid.NewGuid();
                //change the table name below to the source table name you have created 
                string cmdString = "INSERT INTO VETicket (TicketID,Name,Severity) VALUES (@TicketID, @Name, @Severity)";
                SqlConnection connection = Connection.GetConnection();
                using (SqlCommand command = connection.CreateCommand())
                {
                    command.CommandText = cmdString;
                    command.Parameters.AddWithValue("@TicketID", id);
                    command.Parameters.AddWithValue("@Name", entity["new_name"]);
                    command.Parameters.AddWithValue("@Severity", entity["new_severity"]);
                    connection.Open();
                    try
                    {
                        var numRecords = command.ExecuteNonQuery();
                        Console.WriteLine("inserted {0} records", numRecords);
                    }
                    finally
                    {
                        connection.Close();
                    }
                    // other codes. 
                }
                context.OutputParameters["id"] = id;
            }
        }
    }
    

    Code pour UpdatePlugin.cs

    public class UpdatePlugin: IPlugin {
        public void Execute(IServiceProvider serviceProvider)
        {
            var context = serviceProvider.Get<IPluginExecutionContext>();
            Guid id = Guid.Empty;
            if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
            {
                Entity entity = (Entity)context.InputParameters["Target"];
                //change the table name below to the source table name you have created  
                string cmdString = "UPDATE VETicket SET {0} WHERE TicketID=@TicketID";
                SqlConnection connection = Connection.GetConnection();
                using (SqlCommand command = connection.CreateCommand())
                {
                    command.Parameters.AddWithValue("@TicketID", entity["new_ticketid"]);
                    List<string> setList = new List<string>();
                    if (entity.Attributes.Contains("new_name"))
                    {
                        command.Parameters.AddWithValue("@Name", entity["new_name"]);
                        setList.Add("Name=@Name");
                    }
                    if (entity.Attributes.Contains("new_severity"))
                    {
                        command.Parameters.AddWithValue("@Severity", entity["new_severity"]);
                        setList.Add("Severity=@Severity");
                    }
                    command.CommandText = string.Format(cmdString, string.Join(",", setList)); connection.Open();
                    try
                    {
                        var numRecords = command.ExecuteNonQuery();
                        Console.WriteLine("updated {0} records", numRecords);
                    }
                    finally
                    {
                        connection.Close();
                    }
                    // other codes. 
                }
            }
        }
    }
    

    Code pour RetrievePlugin.cs

    public class RetrievePlugin : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            var context = serviceProvider.Get<IPluginExecutionContext>();
            Guid id = Guid.Empty;
            if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is EntityReference)
            {
                EntityReference entityRef = (EntityReference)context.InputParameters["Target"];
                Entity e = new Entity("new_ticket");
                //change the table name below to the source table name you have created  
                string cmdString = "SELECT TicketID, Severity, Name FROM VETicket WHERE TicketID=@TicketID";
                SqlConnection connection = Connection.GetConnection();
                using (SqlCommand command = connection.CreateCommand())
                {
                    command.CommandText = cmdString;
                    command.Parameters.AddWithValue("@TicketID", entityRef.Id);
                    connection.Open();
                    try
                    {
                        using (SqlDataReader reader = command.ExecuteReader())
                        {
                            if (reader.Read())
                            {
                                e.Attributes.Add("new_ticketid", reader.GetGuid(0));
                                e.Attributes.Add("new_severity", reader.GetInt32(1));
                                e.Attributes.Add("new_name", reader.GetString(2));
                            }
                        }
                    }
                    finally
                    {
                        connection.Close();
                    }
                    // other codes. 
                }
                context.OutputParameters["BusinessEntity"] = e;
            }
        }
    }
    

    Code pour RetrieveMultiplePlugin.cs

    public class RetrieveMultiplePlugin : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            var context = serviceProvider.Get<IPluginExecutionContext>();
            EntityCollection collection = new EntityCollection();
            //change the table name below to the source table name you have created  
            string cmdString = "SELECT TicketID, Severity, Name FROM VETicket";
            SqlConnection connection = Connection.GetConnection();
            using (SqlCommand command = connection.CreateCommand())
            {
                command.CommandText = cmdString;
                connection.Open();
                try
                {
                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            Entity e = new Entity("new_ticket");
                            e.Attributes.Add("new_ticketid", reader.GetGuid(0));
                            e.Attributes.Add("new_severity", reader.GetInt32(1));
                            e.Attributes.Add("new_name", reader.GetString(2));
                            collection.Entities.Add(e);
                        }
                    }
                }
                finally
                {
                    connection.Close();
                }
                context.OutputParameters["BusinessEntityCollection"] = collection;
            }
        }
    }
    

    Code pour DeletePlugin.cs

    public class DeletePlugin : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            var context = serviceProvider.Get<IPluginExecutionContext>();
            //comment 
            Guid id = Guid.Empty;
            if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is EntityReference)
            {
                EntityReference entityRef = (EntityReference)context.InputParameters["Target"];
                id = entityRef.Id;
                //change the table name below to the source table name you have created 
                string cmdString = "DELETE VETicket WHERE TicketID=@TicketID";
                SqlConnection connection = Connection.GetConnection();
                using (SqlCommand command = connection.CreateCommand())
                {
                    command.CommandText = cmdString; command.Parameters.AddWithValue("@TicketID", id);
                    connection.Open();
                    try
                    {
                        var numRecords = command.ExecuteNonQuery();
                        Console.WriteLine("deleted {0} records", numRecords);
                    }
                    finally
                    {
                        connection.Close();
                    }
                    // other codes. 
                }
            }
        }
    }
    
  3. Compilez et créez la solution. Vous avez maintenant un fichier d’assembly (.dll) que vous pouvez utiliser pour vous inscrire dans votre environnement Dataverse. Ce fichier est disponible dans le répertoire dossier de solution/bin/Debug.

    DLL d’assembly.

  4. Enregistrez l’assemby à l’aide de Plug-in Registration Tool. Vous pouvez obtenir le dernier pack de de Plug-in Registration Tool depuis NuGet.

  5. Ouvrez Plugin Registration Tool. Vous devez disposer des privilèges d’administration système pour enregistrer l’assembly. Sélectionnez CRÉER UNE CONNEXION pour vous connecter à votre environnement Dataverse. Sélectionnez le menu déroulant Enregistrer, puis Enregistrer un nouvel assembly.

    Enregistrer une nouvelle étape.

  6. Sélectionnez le fichier d’assemblage et enregistrez les plug-ins. Assurez-vous que vous avez sélectionné tous les plug-ins (plug-ins Create, Update, Delete, Retrieve et RetrieveMultiple).

    Inscrire un nouvel assembly.

Étape 2 : Création du fournisseur de données et ajout de plug-ins au fournisseur

  1. Sélectionnez le menu déroulant Enregistrer, puis Enregistrer un nouveau fournisseur de données.

  2. Dans la boîte de dialogue Enregistrer un nouveau fournisseur de données, entrez les détails suivants :

    1. Entrez Nom du fournisseur de données.

    2. Dans l’option Solutions, sélectionnez une solution existante ou créez une solution dans la liste déroulante. Si vous souhaitez créer une solution, sélectionnez l’option NewSolution dans la liste déroulante. Dans la boîte de dialogue Créer une solution, entrez les détails requis et sélectionnez Enregistrer.

    3. Dans l’option Table de source de données (entité), sélectionnez Créer une source de données. Entrez les détails. Assurez-vous que source de données fait partie de la solution que vous avez créée ou sélectionnée.

      Notes

      La table source de données dans Dataverse contient les données de configuration d’un enregistrement source de données à transmettre aux plug-ins du fournisseur.

    4. Mappez chacun des plug-ins enregistrés à ses opérations respectives.

    5. Enregistrez le nouveau fournisseur de données.

      Enregistrer le fournisseur de données.

  3. Dans le Plugin Registration Tool, vous voyez le nouvel enregistrement source de données et le fournisseur de données associé. La sélection de source de données affiche les détails qui incluent les plug-ins et leur GUID enregistré.

    Fournisseur de données enregistré.

Étape 3 : Création d’une table virtuelle dans l’environnement Dataverse

  1. Créez une table virtuelle source de données en accédant à Réglage > Administration > Sources de données de table virtuelle (entité).

  2. Sélectionnez Nouveau, puis le fournisseur de données que vous avez créé à l’étape précédente dans la liste déroulante.

  3. Spécifiez un nom pour la source de données, et sélectionnez Enregistrer et fermer.

  4. Vous êtes maintenant prêt à créer la table virtuelle qui représente la source de données externe. Pour ce faire, accédez à Paramètres > Personnaliser le système.

  5. Dans le volet de navigation de gauche de l’explorateur de solution, sélectionnez Tables (entités), puis sélectionnez Nouveau.

  6. Saisissez les informations suivantes :

    Colonne Description
    Source de données Sélectionnez la source de données créée à l’étape précédente.
    Nom d’affichage Nom de la table virtuelle.
    Nom au pluriel La valeur est complétée automatiquement selon le nom complet.
    Nom Il est également créé automatiquement en fonction de la valeur que vous entrez pour le nom complet.
    Nom externe Nom de la table de la source.
    Nom des collections externes Vous pouvez utiliser la même valeur de la colonne de nom pluriel.
  7. Cliquez sur Enregistrer et fermer.

    Créer un enregistrement.

  8. Dans le volet de navigation de gauche, sélectionnez et développez la table virtuelle que vous avez créée.

  9. Sélectionnez Champs pour mettre à jour et créer des colonnes représentant la source externe.

  10. Sélectionnez la colonne Clé primaire de la table virtuelle et sélectionnez Modifier.

  11. Mettez à jour la colonne Nom externe pour qu’elle corresponde au nom de la colonne dans votre source de données externe. Dans cet exemple, le nom de la colonne externe est TicketID.

    Créer une table.

  12. Sélectionnez Enregistrer et fermer.

  13. Sélectionnez le champ Nom de la table virtuelle et sélectionnez Modifier.

  14. Mettez à jour le champ Nom externe pour qu’elle corresponde au nom du champ dans votre source de données externe. Dans cet exemple, le nom de la colonne externe est Nom.

    Créer un champ de nom.

  15. Sélectionnez Enregistrer et fermer.

  16. Sélectionnez Nouveau pour créer une colonne dans la table virtuelle. Cette colonne représente la colonne de gravité dans la source de données externe.

  17. Entrez les informations suivantes pour les nouvelles colonnes :

    Nom de colonne valeur
    Nom d’affichage Gravité
    Nom new_severity
    Nom externe Niveau de gravité
    Champ requis Contrainte obligatoire
    Type de données Nombre entier

    Créer un champ de gravité.

  18. Sélectionnez Enregistrer et fermer.

Étape 4 : Créer, mettre à jour, afficher et supprimer des enregistrements à l’aide d’une table virtuelle

Créez une application pilotée par modèle et ajoutez la table virtuelle au plan du site. Sélectionnez ensuite le formulaire principal de la table virtuelle et la vue de champ avancée. Publier l’application Pour plus d’informations : Générer votre première application pilotée par modèle à partir de zéro

Créer une application pilotée par modèle.

Les utilisateurs de l’application peuvent effectuer des opérations de lecture, de création, de mise à jour et de suppression à l’aide de la table virtuelle exactement comme avec n’importe quelle autre table dans Microsoft Dataverse.

Voir aussi

Premiers pas avec les tables virtuelles
Considérations relatives à l’API pour les tables virtuelles
Fournisseurs de données de tables virtuelles personnalisées
Présentation de la table virtuelle avec le fournisseur de données OData v4