Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Sampel ini menunjukkan cara menerapkan penyedia data kustom untuk membuat tabel virtual yang mendukung operasi buat, ambil, perbarui, dan hapus. Untuk setiap operasi ini, Anda menerapkan plug-in generik, mendaftarkannya menggunakan Alat Pendaftaran Plugin, dan mengaktifkan sumber data tabel virtual untuk membuat tabel virtual.
Untuk mempelajari selengkapnya tentang penyedia data dan pengembangan plug-in, lihat Penyedia data kustom
Rincian sumber data
Dalam panduan ini, Anda akan menyiapkan tabel sederhana di SQL Server eksternal untuk membuat tabel virtual. Nama tabel yang digunakan dalam contoh ini adalah VETicket.
Nota
Perbarui kode plug-in Anda, jika Anda ingin mengubah nama tabel atau kolom.
| Nama kolom | Jenis Data | Tujuan |
|---|---|---|
| TicketID | Unik Diidentifikasi, Kunci Primer | Kunci primer untuk tabel. |
| Severity | Integer | Nilai tingkat keparahan untuk tiket. |
| Nama | String | Deskripsi tiket. |
Ada empat langkah untuk mengaktifkan penyedia data kustom untuk membuat tabel virtual.
Langkah 1: Menerapkan plug-in CRUD dan mendaftarkan rakitan
Langkah 2: Membuat penyedia data dan menambahkan plug-in ke penyedia
Langkah 3: Membuat tabel virtual di lingkungan Dataverse
Langkah 4: Membuat, memperbarui, menampilkan, dan menghapus rekaman menggunakan tabel virtual
Langkah 1: Menerapkan plug-in CRUD dan mendaftarkan rakitan
Buat proyek plug-in Anda dan instal paket NuGet berikut. Solusi dalam contoh ini bernama StubProvider.
Assembly 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 Tambahkan enam file kelas berikut ke solusi Anda. Di setiap file kelas, tambahkan pernyataan penggunaan berikut
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;Nota
Di setiap file kelas ini, perbarui nama tabel agar sesuai dengan nama tabel sumber yang telah Anda siapkan. Contoh menggunakan VETicket sebagai nama tabel sumber.
Nama file kelas Tujuan Connection.cs Kelas ini berisi kode untuk membuat dan mengelola koneksi ke sumber data SQL eksternal. Ini termasuk parameter string koneksi khusus untuk database eksternal dan informasi autentikasi berbasis SQL yang diperlukan untuk membuat koneksi. Ganti nilai masing-masing untuk: server database, UserID, Kata Sandi, dan nama tabel yang akan Anda gunakan saat membuat tabel virtual di Dataverse. CreatePlugin.cs Kelas ini berisi kode yang menangani operasi buat untuk tabel virtual. UpdatePlugin.cs Kelas ini berisi kode yang menangani pembaruan rekaman dalam tabel virtual. RetrievePlugin.cs Kelas ini berisi kode yang mengambil rekaman tertentu dari tabel virtual. RetrieveMultiplePlugin.cs Kelas ini berisi kode untuk mengambil beberapa rekaman dari tabel virtual. DeletePlugin.cs Kelas ini berisi kode yang memungkinkan Anda menghapus rekaman dalam tabel virtual.
Baca informasi penting berikut tentang menggunakan string koneksi atau autentikasi nama pengguna/kata sandi dalam kode aplikasi.
Penting
Microsoft menyarankan agar Anda menggunakan alur autentikasi paling aman yang tersedia. Alur autentikasi yang dijelaskan dalam artikel ini memerlukan tingkat kepercayaan yang sangat tinggi pada aplikasi, dan membawa risiko yang tidak ada dalam alur lain. Anda hanya boleh menggunakan alur ini ketika alur lain yang lebih aman, seperti identitas terkelola, tidak layak.
Kode untuk 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;
}
}
}
Kode untuk 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;
}
}
}
Kode untuk 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.
}
}
}
}
Kode untuk 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;
}
}
}
Kode untuk 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;
}
}
}
Kode untuk 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.
}
}
}
}
Mengkompilasi dan membangun solusi. Anda sekarang akan memiliki file rakitan (.dll) yang dapat Anda gunakan untuk mendaftar di lingkungan Dataverse Anda. Anda akan menemukan file ini di folder solusi/direktori bin/Debug .
Daftarkan komponen menggunakan Alat Pendaftaran Plugin. Anda bisa mendapatkan paket Plugin Registration Tool terbaru dari NuGet.
Buka Alat Pendaftaran Plugin. Anda harus memiliki hak istimewa administrasi sistem untuk mendaftarkan assembly. Pilih BUAT KONEKSI BARU untuk menyambungkan ke lingkungan Dataverse Anda. Pilih menu drop-down Daftar lalu pilih Daftarkan Rakitan Baru.
Pilih file rakitan dan daftarkan plug-in. Pastikan Anda telah memilih semua plug-in (Plug-in Create, Update, Delete, Retrieve, dan RetrieveMultiple).
Langkah 2: Membuat penyedia data dan menambahkan plug-in ke penyedia
Pilih menu drop-down Daftar lalu pilih Daftarkan Penyedia Data Baru.
Dalam dialog Daftarkan Penyedia Data Baru , masukkan detail berikut ini:
Masukkan Nama Penyedia Data.
Di opsi Solusi , pilih solusi yang sudah ada atau buat solusi baru di menu drop-down. Jika Anda ingin membuat solusi baru, pilih opsi NewSolution dari menu drop-down. Dalam dialog Buat Solusi Baru , masukkan detail yang diperlukan dan pilih Simpan.
Di opsi Tabel Sumber Data (Entitas) , pilih Buat Sumber Data Baru. Masukkan detailnya. Pastikan bahwa sumber data adalah bagian dari solusi yang Anda buat atau pilih.
Nota
Tabel sumber data di Dataverse menyimpan data konfigurasi untuk rekaman sumber data yang akan diteruskan ke plug-in penyedia.
Petakan setiap plug-in yang terdaftar ke operasinya masing-masing.
Daftarkan penyedia data baru.
Di Alat Pendaftaran Plugin, Anda akan melihat rekaman sumber data baru dan penyedia data terkait. Memilih sumber data akan menampilkan detail yang mencakup plugin dan GUID yang telah didaftarkan.
Langkah 3: Membuat tabel virtual di lingkungan Dataverse
Buat sumber data tabel virtual baru dengan menavigasi ke Pengaturan>Administrasi>Sumber Data Tabel Virtual (Entitas).
Pilih Baru lalu pilih penyedia data yang Anda buat di langkah sebelumnya dari menu drop-down.
Masukkan nama untuk sumber data dan pilih Simpan dan Tutup.
Anda sekarang siap untuk membuat tabel virtual yang mewakili sumber data eksternal. Untuk melakukan ini, buka Pengaturan>Sesuaikan Sistem.
Di panel navigasi kiri penjelajah solusi, Pilih Tabel (Entitas), lalu pilih Baru.
Masukkan detail berikut:
Column Description Sumber data Pilih sumber data yang Anda buat di langkah sebelumnya. Nama Tampilan Nama tabel virtual. Nama Jamak Nilai akan diisi secara otomatis berdasarkan nama tampilan. Nama Ini juga akan dibuat secara otomatis berdasarkan nilai yang Anda masukkan untuk nama tampilan. Nama Eksternal Nama tabel sumber. Nama Koleksi Eksternal Anda dapat menggunakan nilai yang sama dari kolom nama jamak. Pilih Simpan dan Tutup.
Di panel navigasi kiri, pilih dan perluas pada tabel virtual yang Anda buat.
Pilih Bidang untuk memperbarui dan membuat kolom baru yang mewakili sumber eksternal.
Pilih kolom Kunci Primer untuk tabel virtual dan pilih Edit.
Perbarui kolom Nama Eksternal agar sesuai dengan nama kolom di sumber data eksternal Anda. Dalam contoh ini, nama kolom eksternal adalah TicketID.
Pilih Simpan dan Tutup.
Pilih bidang Nama untuk tabel virtual dan pilih Edit.
Perbarui bidang Nama Eksternal agar sesuai dengan nama bidang di sumber data eksternal Anda. Dalam contoh ini, nama kolom eksternal adalah Nama.
Pilih Simpan dan Tutup.
Pilih Baru untuk membuat kolom baru di tabel virtual. Kolom ini akan mewakili kolom tingkat keparahan di sumber data eksternal.
Masukkan informasi berikut untuk kolom baru:
Nama kolom Nilai Nama Tampilan Severity Nama new_severity Nama Eksternal Severity Persyaratan Bidang Bisnis Wajib Jenis Data Bilangan Cacah
Pilih Simpan dan Tutup.
Langkah 4: Membuat, memperbarui, menampilkan, dan menghapus rekaman menggunakan tabel virtual
Buat aplikasi berbasis model dan tambahkan tabel virtual ke peta situs. Kemudian pilih formulir utama tabel virtual dan tampilan bidang Tingkat Lanjut. Terbitkan aplikasi. Informasi selengkapnya: Membangun aplikasi berbasis model pertama Anda dari awal
Pengguna aplikasi dapat melakukan operasi baca, buat, perbarui, hapus menggunakan tabel virtual seperti tabel lain di Microsoft Dataverse.
Lihat juga
Mulai menggunakan tabel virtual
Pertimbangan API untuk tabel virtual
Penyedia data tabel virtual khusus
Panduan tabel virtual menggunakan Penyedia Data OData v4