Bagikan melalui


Sampel: Penyedia tabel virtual kustom dengan operasi CRUD

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

  1. 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
  2. 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. 
            }
        }
    }
}
  1. 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 .

    Assembly dll.

  2. Daftarkan komponen menggunakan Alat Pendaftaran Plugin. Anda bisa mendapatkan paket Plugin Registration Tool terbaru dari NuGet.

  3. 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.

    Daftarkan langkah baru.

  4. Pilih file rakitan dan daftarkan plug-in. Pastikan Anda telah memilih semua plug-in (Plug-in Create, Update, Delete, Retrieve, dan RetrieveMultiple).

    Daftarkan rakitan baru.

Langkah 2: Membuat penyedia data dan menambahkan plug-in ke penyedia

  1. Pilih menu drop-down Daftar lalu pilih Daftarkan Penyedia Data Baru.

  2. Dalam dialog Daftarkan Penyedia Data Baru , masukkan detail berikut ini:

    1. Masukkan Nama Penyedia Data.

    2. 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.

    3. 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.

    4. Petakan setiap plug-in yang terdaftar ke operasinya masing-masing.

    5. Daftarkan penyedia data baru.

      Daftarkan penyedia data.

  3. 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.

    Penyedia data terdaftar.

Langkah 3: Membuat tabel virtual di lingkungan Dataverse

  1. Buat sumber data tabel virtual baru dengan menavigasi ke Pengaturan>Administrasi>Sumber Data Tabel Virtual (Entitas).

  2. Pilih Baru lalu pilih penyedia data yang Anda buat di langkah sebelumnya dari menu drop-down.

  3. Masukkan nama untuk sumber data dan pilih Simpan dan Tutup.

  4. Anda sekarang siap untuk membuat tabel virtual yang mewakili sumber data eksternal. Untuk melakukan ini, buka Pengaturan>Sesuaikan Sistem.

  5. Di panel navigasi kiri penjelajah solusi, Pilih Tabel (Entitas), lalu pilih Baru.

  6. 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.
  7. Pilih Simpan dan Tutup.

    Buat rekaman baru.

  8. Di panel navigasi kiri, pilih dan perluas pada tabel virtual yang Anda buat.

  9. Pilih Bidang untuk memperbarui dan membuat kolom baru yang mewakili sumber eksternal.

  10. Pilih kolom Kunci Primer untuk tabel virtual dan pilih Edit.

  11. Perbarui kolom Nama Eksternal agar sesuai dengan nama kolom di sumber data eksternal Anda. Dalam contoh ini, nama kolom eksternal adalah TicketID.

    Buat tabel baru.

  12. Pilih Simpan dan Tutup.

  13. Pilih bidang Nama untuk tabel virtual dan pilih Edit.

  14. Perbarui bidang Nama Eksternal agar sesuai dengan nama bidang di sumber data eksternal Anda. Dalam contoh ini, nama kolom eksternal adalah Nama.

    Buat bidang nama baru.

  15. Pilih Simpan dan Tutup.

  16. Pilih Baru untuk membuat kolom baru di tabel virtual. Kolom ini akan mewakili kolom tingkat keparahan di sumber data eksternal.

  17. 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

    Buat bidang tingkat keparahan baru.

  18. 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

Buat aplikasi berbasis model.

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