Udostępnij przez


Przykład: niestandardowy dostawca tabel wirtualnych z operacjami CRUD

W tym przykładzie pokazano, jak zaimplementować niestandardowego dostawcę danych w celu utworzenia tabeli wirtualnej obsługującej operacje tworzenia, pobierania, aktualizowania i usuwania. Dla każdej z tych operacji należy zaimplementować ogólną wtyczkę, zarejestrować je przy użyciu narzędzia rejestracji wtyczki i włączyć źródła danych tabeli wirtualnej w celu utworzenia tabeli wirtualnej.

Aby dowiedzieć się więcej na temat dostawców danych i tworzenia wtyczek, zobacz Niestandardowi dostawcy danych

Szczegóły dotyczące źródła danych

W tym przewodniku skonfigurujesz prostą tabelę w zewnętrznym programie SQL Server, aby utworzyć tabelę wirtualną. Nazwa tabeli używana w tym przykładzie to VETicket.

Uwaga / Notatka

Zaktualizuj kod wtyczki, jeśli chcesz zmienić nazwę tabeli lub kolumn.

Nazwa kolumny Typ danych Przeznaczenie
TicketID Identyfikator unikalny, klucz podstawowy Klucz podstawowy tabeli.
Severity Integer Wartość ważności biletu.
Name Sznurek Opis biletu.

Istnieją cztery kroki umożliwiające utworzenie tabeli wirtualnej przez niestandardowego dostawcę danych.

Krok 1. Implementowanie wtyczek CRUD i rejestrowanie zestawu

Krok 2. Tworzenie dostawcy danych i dodawanie wtyczek do dostawcy

Krok 3. Tworzenie tabeli wirtualnej w środowisku Dataverse

Krok 4. Tworzenie, aktualizowanie, wyświetlanie i usuwanie rekordów przy użyciu tabeli wirtualnej

Krok 1. Implementowanie wtyczek CRUD i rejestrowanie zestawu

  1. Utwórz projekt wtyczek i zainstaluj następujące pakiety NuGet. Rozwiązanie w tym przykładzie nosi nazwę StubProvider.

    Assembly adres 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. Dodaj sześć następujących plików klas do rozwiązania. W każdym z plików klasy dodaj następujące instrukcje using

    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; 
    

    Uwaga / Notatka

    W każdym z tych plików klas zaktualizuj nazwę tabeli, aby odpowiadała nazwie tabeli źródłowej, którą skonfigurowałeś. W przykładzie użyto VETicket jako nazwy tabeli źródłowej.

    Nazwa pliku klasy Przeznaczenie
    Connection.cs Ta klasa zawiera kod umożliwiający tworzenie połączenia z zewnętrznym źródłem danych SQL i zarządzanie nim. Zawiera parametry połączenia specyficzne dla zewnętrznej bazy danych i informacji uwierzytelniania opartych na języku SQL wymaganych do nawiązania połączenia. Zastąp wartości odpowiednie dla Twojego serwera bazy danych, identyfikatora użytkownika (UserID), hasła i nazwy tabeli dla tabeli wirtualnej tworzonej w usłudze Dataverse.
    CreatePlugin.cs Ta klasa zawiera kod, który obsługuje operację tworzenia dla tabeli wirtualnej.
    UpdatePlugin.cs Ta klasa zawiera kod, który obsługuje aktualizowanie rekordów w tabeli wirtualnej.
    RetrievePlugin.cs Ta klasa zawiera kod, który pobiera określony rekord z tabeli wirtualnej.
    RetrieveMultiplePlugin.cs Ta klasa zawiera kod pobierania wielu rekordów z tabeli wirtualnej.
    DeletePlugin.cs Ta klasa zawiera kod, który umożliwia usunięcie rekordu w tabeli wirtualnej.

Przeczytaj następujące ważne informacje dotyczące używania parametrów połączenia lub uwierzytelniania nazwy użytkownika/hasła w kodzie aplikacji.

Ważne

Firma Microsoft zaleca korzystanie z najbezpieczniejszego dostępnego przepływu uwierzytelniania. Przepływ uwierzytelniania opisany w tym artykule wymaga bardzo wysokiego poziomu zaufania w aplikacji i niesie ze sobą ryzyko, które nie występują w innych przepływach. Tego przepływu należy używać tylko wtedy, gdy inne bezpieczniejsze przepływy, takie jak tożsamości zarządzane, nie są opłacalne.

Kod dla 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;
       }
   }
}

Kod 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;
        }
    }
}

Kod dla 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. 
            }
        }
    }
}

Kod dla 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;
        }
    }
}

Kod 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;
        }
    }
}

Kod 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. 
            }
        }
    }
}
  1. Skompiluj i zbuduj rozwiązanie. Teraz będziesz mieć plik zestawu (.dll), którego można użyć do zarejestrowania w środowisku Dataverse. Ten plik znajdziesz w katalogu folderze rozwiązania/bin/Debug.

    Biblioteka DLL zestawu.

  2. Zarejestruj zestaw przy użyciu narzędzia rejestracji wtyczki. Najnowszą wersję pakietu narzędzia rejestracji wtyczki można pobrać z narzędzia NuGet.

  3. Otwórz narzędzie rejestracji wtyczki. Aby zarejestrować zestaw, musisz mieć uprawnienia administratora systemu. Wybierz pozycję UTWÓRZ NOWE POŁĄCZENIE , aby nawiązać połączenie ze środowiskiem Usługi Dataverse. Wybierz listę rozwijaną Zarejestruj, a następnie wybierz opcję Zarejestruj nowy zestaw.

    Zarejestruj nowy krok.

  4. Wybierz plik zestawu i zarejestruj dodatki plug-in. Upewnij się, że wybrano wszystkie wtyczki (Create, Update, Delete, Retrieve i RetrieveMultiple).

    Zarejestruj nowy zestaw.

Krok 2. Tworzenie dostawcy danych i dodawanie wtyczek do dostawcy

  1. Wybierz listę rozwijaną Zarejestruj , a następnie wybierz pozycję Zarejestruj nowego dostawcę danych.

  2. W oknie dialogowym Rejestrowanie nowego dostawcy danych wprowadź następujące informacje:

    1. Wprowadź nazwę dostawcy danych.

    2. W opcji Rozwiązania wybierz istniejące rozwiązanie lub utwórz nowe rozwiązanie na liście rozwijanej. Jeśli chcesz utworzyć nowe rozwiązanie, wybierz opcję NowyRozwiązywanie z listy rozwijanej. W oknie dialogowym Tworzenie nowego rozwiązania wprowadź wymagane szczegóły i wybierz pozycję Zapisz.

    3. W opcji Tabela źródła danych (jednostka) wybierz pozycję Utwórz nowe źródło danych. Wprowadź szczegóły. Upewnij się, że źródło danych jest częścią utworzonego lub wybranego rozwiązania.

      Uwaga / Notatka

      Tabela źródła danych w usłudze Dataverse zawiera dane konfiguracji rekordu źródłowego, które mają zostać przesłane do wtyczek dostawcy.

    4. Przypisz każdą zarejestrowaną wtyczkę do jej odpowiednich operacji.

    5. Zarejestruj nowego dostawcę danych.

      Zarejestruj dostawcę danych.

  3. W narzędziu do rejestracji wtyczki zobaczysz nowy rekord źródła danych i skojarzonego dostawcę danych. Wybranie źródła danych spowoduje wyświetlenie szczegółów, które obejmują dodatki plug-in i zarejestrowany identyfikator GUID.

    Zarejestrowany dostawca danych.

Krok 3. Tworzenie tabeli wirtualnej w środowisku Dataverse

  1. Utwórz nowe źródło danych tabeli wirtualnej, przechodząc do Ustawienia>Administracja>Źródła Danych Tabeli Wirtualnej (Encja).

  2. Wybierz pozycję Nowy , a następnie wybierz dostawcę danych utworzonego w poprzednim kroku z listy rozwijanej.

  3. Wprowadź nazwę źródła danych i wybierz pozycję Zapisz i zamknij.

  4. Teraz możesz utworzyć tabelę wirtualną reprezentującą zewnętrzne źródło danych. W tym celu przejdź do pozycji Ustawienia>Dostosuj system.

  5. W okienku nawigacji po lewej stronie eksploratora rozwiązań wybierz pozycję Tabele (jednostki), a następnie wybierz pozycję Nowy.

  6. Wprowadź następujące szczegóły:

    Kolumna Description
    Źródło danych Wybierz źródło danych utworzone w poprzednim kroku.
    Wyświetlana nazwa Nazwa tabeli wirtualnej.
    Nazwa w liczbie mnogiej Wartość zostanie automatycznie wypełniona na podstawie nazwy wyświetlanej.
    Name Zostanie on również utworzony automatycznie na podstawie wartości wprowadzonej dla nazwy wyświetlanej.
    Nazwa zewnętrzna Nazwa tabeli źródłowej.
    Nazwa kolekcji zewnętrznych Możesz użyć tej samej wartości z kolumny nazwy mnogiej.
  7. Wybierz pozycję Zapisz i zamknij.

    Utwórz nowy rekord.

  8. W okienku nawigacji po lewej stronie wybierz i rozwiń utworzoną tabelę wirtualną.

  9. Wybierz Pola, aby zaktualizować i utworzyć nowe kolumny odzwierciedlające źródło zewnętrzne.

  10. Wybierz kolumnę Klucz podstawowy dla tabeli wirtualnej i wybierz pozycję Edytuj.

  11. Zaktualizuj kolumnę Nazwa zewnętrzna , aby odpowiadała nazwie kolumny w zewnętrznym źródle danych. W tym przykładzie nazwa kolumny zewnętrznej to TicketID.

    Utwórz nową tabelę.

  12. Wybierz pozycję Zapisz i zamknij.

  13. Wybierz pole Nazwa dla tabeli wirtualnej i wybierz pozycję Edytuj.

  14. Zaktualizuj pole Nazwa zewnętrzna , aby było zgodne z nazwą pola w zewnętrznym źródle danych. W tym przykładzie nazwa kolumny zewnętrznej to Nazwa.

    Utwórz nowe pole nazwy.

  15. Wybierz pozycję Zapisz i zamknij.

  16. Wybierz pozycję Nowy , aby utworzyć nową kolumnę w tabeli wirtualnej. Ta kolumna będzie reprezentować kolumnę ważności w zewnętrznym źródle danych.

  17. Wprowadź następujące informacje dla nowych kolumn:

    Nazwa kolumny Wartość
    Wyświetlana nazwa Severity
    Name new_severity
    Nazwa zewnętrzna Severity
    Wymaganie dotyczące pola Wymagane dane firmowe
    Typ danych Liczbowy całkowity

    Utwórz nowe pole ważności.

  18. Wybierz pozycję Zapisz i zamknij.

Krok 4. Tworzenie, aktualizowanie, wyświetlanie i usuwanie rekordów przy użyciu tabeli wirtualnej

Utwórz aplikację opartą na modelu i dodaj tabelę wirtualną do mapy witryny. Następnie wybierz formularz główny widoku tabeli wirtualnej oraz widok zaawansowanych pól. Opublikuj aplikację. Więcej informacji: Tworzenie pierwszej aplikacji opartej na modelu od podstaw

Tworzenie aplikacji opartej na modelu.

Użytkownicy aplikacji mogą wykonywać operacje odczytu, tworzenia, aktualizowania i usuwania przy użyciu tabeli wirtualnej tak jak każda inna tabela w usłudze Microsoft Dataverse.

Zobacz także

Wprowadzenie do tabel wirtualnych
Zagadnienia dotyczące interfejsu API dotyczące tabel wirtualnych
Niestandardowi dostawcy danych tabel wirtualnych
Przewodnik po tabeli wirtualnej przy użyciu dostawcy danych OData w wersji 4