Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
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 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.
}
}
}
}
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.
Zarejestruj zestaw przy użyciu narzędzia rejestracji wtyczki. Najnowszą wersję pakietu narzędzia rejestracji wtyczki można pobrać z narzędzia NuGet.
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.
Wybierz plik zestawu i zarejestruj dodatki plug-in. Upewnij się, że wybrano wszystkie wtyczki (Create, Update, Delete, Retrieve i RetrieveMultiple).
Krok 2. Tworzenie dostawcy danych i dodawanie wtyczek do dostawcy
Wybierz listę rozwijaną Zarejestruj , a następnie wybierz pozycję Zarejestruj nowego dostawcę danych.
W oknie dialogowym Rejestrowanie nowego dostawcy danych wprowadź następujące informacje:
Wprowadź nazwę dostawcy danych.
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.
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.
Przypisz każdą zarejestrowaną wtyczkę do jej odpowiednich operacji.
Zarejestruj nowego dostawcę danych.
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.
Krok 3. Tworzenie tabeli wirtualnej w środowisku Dataverse
Utwórz nowe źródło danych tabeli wirtualnej, przechodząc do Ustawienia>Administracja>Źródła Danych Tabeli Wirtualnej (Encja).
Wybierz pozycję Nowy , a następnie wybierz dostawcę danych utworzonego w poprzednim kroku z listy rozwijanej.
Wprowadź nazwę źródła danych i wybierz pozycję Zapisz i zamknij.
Teraz możesz utworzyć tabelę wirtualną reprezentującą zewnętrzne źródło danych. W tym celu przejdź do pozycji Ustawienia>Dostosuj system.
W okienku nawigacji po lewej stronie eksploratora rozwiązań wybierz pozycję Tabele (jednostki), a następnie wybierz pozycję Nowy.
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. Wybierz pozycję Zapisz i zamknij.
W okienku nawigacji po lewej stronie wybierz i rozwiń utworzoną tabelę wirtualną.
Wybierz Pola, aby zaktualizować i utworzyć nowe kolumny odzwierciedlające źródło zewnętrzne.
Wybierz kolumnę Klucz podstawowy dla tabeli wirtualnej i wybierz pozycję Edytuj.
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.
Wybierz pozycję Zapisz i zamknij.
Wybierz pole Nazwa dla tabeli wirtualnej i wybierz pozycję Edytuj.
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.
Wybierz pozycję Zapisz i zamknij.
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.
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
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
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