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 1 : implémentation des plug-ins CRUD et enregistrement de l’assembly
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 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. } } } }
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.
Enregistrez l’assemby à l’aide de Plug-in Registration Tool. Vous pouvez obtenir le dernier pack de de Plug-in Registration Tool depuis NuGet.
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.
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).
Étape 2 : Création du fournisseur de données et ajout de plug-ins au fournisseur
Sélectionnez le menu déroulant Enregistrer, puis Enregistrer un nouveau fournisseur de données.
Dans la boîte de dialogue Enregistrer un nouveau fournisseur de données, entrez les détails suivants :
Entrez Nom du fournisseur de données.
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.
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.
Mappez chacun des plug-ins enregistrés à ses opérations respectives.
Enregistrez le nouveau fournisseur de données.
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é.
Étape 3 : Création d’une table virtuelle dans l’environnement Dataverse
Créez une table virtuelle source de données en accédant à Réglage > Administration > Sources de données de table virtuelle (entité).
Sélectionnez Nouveau, puis le fournisseur de données que vous avez créé à l’étape précédente dans la liste déroulante.
Spécifiez un nom pour la source de données, et sélectionnez Enregistrer et fermer.
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.
Dans le volet de navigation de gauche de l’explorateur de solution, sélectionnez Tables (entités), puis sélectionnez Nouveau.
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. Cliquez sur Enregistrer et fermer.
Dans le volet de navigation de gauche, sélectionnez et développez la table virtuelle que vous avez créée.
Sélectionnez Champs pour mettre à jour et créer des colonnes représentant la source externe.
Sélectionnez la colonne Clé primaire de la table virtuelle et sélectionnez Modifier.
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.
Sélectionnez Enregistrer et fermer.
Sélectionnez le champ Nom de la table virtuelle et sélectionnez Modifier.
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.
Sélectionnez Enregistrer et fermer.
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.
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 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
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