หมายเหตุ
การเข้าถึงหน้านี้ต้องได้รับการอนุญาต คุณสามารถลอง ลงชื่อเข้าใช้หรือเปลี่ยนไดเรกทอรีได้
การเข้าถึงหน้านี้ต้องได้รับการอนุญาต คุณสามารถลองเปลี่ยนไดเรกทอรีได้
ตัวอย่างนี้แสดงวิธีการใช้ตัวให้บริการข้อมูลแบบกําหนดเองเพื่อสร้างตารางเสมือนที่สนับสนุนการสร้าง เรียกใช้ อัปเดต และลบการดําเนินการ สําหรับแต่ละการดําเนินการเหล่านี้ คุณใช้ปลั๊กอินทั่วไป ลงทะเบียนโดยใช้ Plugin Registration Tool และเปิดใช้งานแหล่งข้อมูลตารางเสมือนเพื่อสร้างตารางเสมือน
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับผู้ให้บริการข้อมูลและการพัฒนาปลั๊กอิน โปรดดู ผู้ให้บริการข้อมูลแบบกําหนดเอง
รายละเอียดแหล่งข้อมูล
ในการฝึกปฏิบัตินี้ คุณจะตั้งค่าตารางอย่างง่ายใน SQL Server ภายนอกเพื่อสร้างตารางเสมือน ชื่อตารางที่ใช้ในตัวอย่างนี้คือ VETicket
Note
อัปเดตรหัสปลั๊กอินของคุณ ถ้าคุณต้องการเปลี่ยนชื่อของตารางหรือคอลัมน์
| ชื่อคอลัมน์ | ชนิดข้อมูล | จุดประสงค์ |
|---|---|---|
| TicketID | ตัวระบุเฉพาะ, คีย์หลัก | คีย์หลักสําหรับตาราง |
| ความรุนแรง | Integer | ค่าความรุนแรงสําหรับตั๋ว |
| ชื่อ | สตริง | คําอธิบายของตั๋ว |
มีสี่ขั้นตอนในการเปิดใช้งานตัวให้บริการข้อมูลแบบกําหนดเองเพื่อสร้างตารางเสมือน
ขั้นตอนที่ 1: ใช้งานปลั๊กอิน CRUD และลงทะเบียนแอสเซมบลี
ขั้นตอนที่ 2: การสร้างผู้ให้บริการข้อมูลและการเพิ่มปลั๊กอินไปยังผู้ให้บริการ
ขั้นตอนที่ 3: การสร้างตารางเสมือนในสภาพแวดล้อม Dataverse
ขั้นตอนที่ 4: สร้าง อัปเดต ดู และลบเรกคอร์ดโดยใช้ตารางเสมือน
ขั้นตอนที่ 1: ใช้งานปลั๊กอิน CRUD และลงทะเบียนแอสเซมบลี
สร้างโครงการปลั๊กอินของคุณและติดตั้งแพคเกจ NuGet ต่อไปนี้ โซลูชันในตัวอย่างนี้มีชื่อว่า StubProvider
การประกอบ 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 เพิ่มไฟล์คลาสหกไฟล์ต่อไปนี้ลงในโซลูชันของคุณ ในแต่ละไฟล์คลาส ให้เพิ่มรายการต่อไปนี้โดยใช้คําสั่ง
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;Note
ในแต่ละไฟล์คลาสเหล่านี้ ให้อัปเดตชื่อตารางเพื่อให้ตรงกับชื่อตารางต้นทางที่คุณตั้งค่า ตัวอย่างนี้ใช้ VETicket เป็นชื่อตารางต้นทาง
ชื่อไฟล์คลาส จุดประสงค์ Connection.cs ระดับชั้นนี้ประกอบด้วยรหัสสําหรับการสร้างและจัดการการเชื่อมต่อไปยังแหล่งข้อมูล SQL ภายนอก ซึ่งรวมถึงพารามิเตอร์สตริงการเชื่อมต่อเฉพาะสําหรับฐานข้อมูลภายนอกและข้อมูลการรับรองความถูกต้องที่ใช้ SQL ที่จําเป็นในการสร้างการเชื่อมต่อ แทนที่ค่าที่เกี่ยวข้องกับของคุณ: เซิร์ฟเวอร์ฐานข้อมูล UserID รหัสผ่าน และชื่อตารางที่คุณจะสร้างตารางเสมือนใน Dataverse CreatePlugin.cs คลาสนี้ประกอบด้วยโค้ดที่จัดการการดําเนินการสร้างสําหรับตารางเสมือน UpdatePlugin.cs คลาสนี้ประกอบด้วยรหัสที่จัดการการอัปเดตเรกคอร์ดในตารางเสมือน RetrievePlugin.cs ระดับชั้นนี้ประกอบด้วยรหัสที่ดึงข้อมูลเรกคอร์ดเฉพาะจากตารางเสมือน RetrieveMultiplePlugin.cs คลาสนี้ประกอบด้วยรหัสสําหรับการดึงข้อมูลหลายเรกคอร์ดจากตารางเสมือน DeletePlugin.cs ระดับชั้นนี้ประกอบด้วยรหัสที่ช่วยให้คุณสามารถลบเรกคอร์ดในตารางเสมือนได้
อ่านข้อมูลสําคัญต่อไปนี้เกี่ยวกับการใช้สตริงการเชื่อมต่อ หรือการรับรองความถูกต้องชื่อผู้ใช้/รหัสผ่านในรหัสแอปพลิเคชัน
สําคัญ
Microsoft แนะนําให้คุณใช้โฟลว์การรับรองความถูกต้องที่ปลอดภัยที่สุดที่พร้อมใช้งาน โฟลว์การรับรองความถูกต้องที่อธิบายไว้ในบทความนี้จําเป็นต้องมีความน่าเชื่อถือในแอปพลิเคชันในระดับสูง และมีความเสี่ยงที่ไม่ได้อยู่ในโฟลว์อื่น ๆ คุณควรใช้โฟลว์นี้เมื่อโฟลว์อื่น ๆ มีความปลอดภัยมากขึ้น เช่น ข้อมูลประจําตัวที่มีการจัดการ จะไม่สามารถทํางานได้
รหัสสําหรับ 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;
}
}
}
รหัสสําหรับ 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;
}
}
}
รหัสสําหรับ 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.
}
}
}
}
รหัสสําหรับ 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;
}
}
}
รหัสสําหรับ 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;
}
}
}
รหัสสําหรับ 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.
}
}
}
}
รวบรวมและสร้างโซลูชัน ขณะนี้คุณจะมีไฟล์แอสเซมบลี (.dll) ที่คุณสามารถใช้เพื่อลงทะเบียนในสภาพแวดล้อม Dataverse ของคุณ คุณจะพบไฟล์นี้ใน โฟลเดอร์โซลูชัน/bin/Debug directory
ลงทะเบียนแอสเซมบลีโดยใช้เครื่องมือการลงทะเบียนปลั๊กอิน คุณสามารถรับแพคเกจเครื่องมือการลงทะเบียนปลั๊กอินล่าสุดได้จาก NuGet
เปิดเครื่องมือลงทะเบียนปลั๊กอิน คุณจําเป็นต้องมีสิทธิ์การดูแลระบบเพื่อลงทะเบียนแอสเซมบลี เลือก สร้างการเชื่อมต่อใหม่ เพื่อเชื่อมต่อกับสภาพแวดล้อม Dataverse ของคุณ เลือก ตัวเลือก รายการแบบเลื่อนลง ลงทะเบียน จากนั้นเลือก ลงทะเบียนแอสเซมบลีใหม่
เลือกไฟล์แอสเซมบลีและลงทะเบียนปลั๊กอิน ตรวจสอบให้แน่ใจว่าคุณได้เลือกปลั๊กอินทั้งหมด (ปลั๊กอิน สร้าง อัปเดต ลบ เรียกใช้ และ RetrieveMultiple)
ขั้นตอนที่ 2: การสร้างผู้ให้บริการข้อมูลและการเพิ่มปลั๊กอินไปยังผู้ให้บริการ
เลือกเมนูดรอปดาวน์ ลงทะเบียน จากนั้นเลือก ลงทะเบียนผู้ให้บริการข้อมูลใหม่
ในกล่องโต้ตอบ ลงทะเบียนผู้ให้บริการข้อมูลใหม่ ให้ใส่รายละเอียดต่อไปนี้:
ใส่ชื่อตัวให้บริการข้อมูล
ในตัวเลือก โซลูชัน เลือกโซลูชันที่มีอยู่ หรือสร้างโซลูชันใหม่ในรายการดรอปดาวน์ ถ้าคุณต้องการสร้างโซลูชันใหม่ ให้เลือกตัวเลือก NewSolution จากรายการดรอปดาวน์ ในกล่องโต้ตอบ สร้างโซลูชันใหม่ ให้ใส่รายละเอียดที่จําเป็นและเลือก บันทึก
ในตัวเลือก ตารางแหล่งข้อมูล (เอนทิตี) ให้เลือก สร้างแหล่งข้อมูลใหม่ ป้อนรายละเอียด ตรวจสอบให้แน่ใจว่าแหล่งข้อมูลเป็นส่วนหนึ่งของโซลูชันที่คุณสร้างหรือเลือก
Note
ตารางแหล่งข้อมูลใน Dataverse เก็บข้อมูลการกําหนดค่าสําหรับระเบียนแหล่งข้อมูลที่จะส่งผ่านไปยังปลั๊กอินของผู้ให้บริการ
จับคู่แต่ละปลั๊กอินที่ลงทะเบียนกับการดำเนินการที่เกี่ยวข้อง
ลงทะเบียนผู้ให้บริการข้อมูลใหม่
ในเครื่องมือการลงทะเบียนปลั๊กอินคุณจะเห็นระเบียนแหล่งข้อมูลใหม่และผู้ให้บริการข้อมูลที่เกี่ยวข้อง การเลือกแหล่งข้อมูลจะแสดงรายละเอียดซึ่งรวมถึงปลั๊กอินและ GUID ที่ลงทะเบียนไว้
ขั้นตอนที่ 3: การสร้างตารางเสมือนในสภาพแวดล้อม Dataverse
สร้างแหล่งข้อมูลตารางเสมือนใหม่ โดยการนําทางไปยังการตั้งค่า>>การจัดการตารางเสมือน (เอนทิตี) แหล่งข้อมูล
เลือก ใหม่ จากนั้นเลือกผู้ให้บริการข้อมูลที่คุณสร้างขึ้นในขั้นตอนก่อนหน้าจากรายการดรอปดาวน์
ใส่ชื่อสําหรับแหล่งข้อมูลและเลือก บันทึกและปิด
ในตอนนี้คุณก็พร้อมที่จะสร้างตารางเสมือนที่แสดงถึงแหล่งข้อมูลภายนอกแล้ว เมื่อต้องการทําเช่นนี้ไปที่การตั้งค่า>ปรับแต่งระบบ
ในบานหน้าต่างนําทางด้านซ้ายของตัวสํารวจโซลูชัน เลือกตาราง (เอนทิตี) จากนั้นเลือกใหม่
ป้อนรายละเอียดต่อไปนี้:
Column คำอธิบาย แหล่งข้อมูล เลือกแหล่งข้อมูลที่คุณสร้างขึ้นในขั้นตอนก่อนหน้า ชื่อที่ใช้แสดง ชื่อตารางเสมือน ชื่อพหูพจน์ ค่าจะถูกเติมโดยอัตโนมัติโดยยึดตามชื่อที่แสดง ชื่อ ซึ่งจะถูกสร้างขึ้นโดยอัตโนมัติโดยยึดตามค่าที่คุณป้อนสําหรับชื่อที่แสดง ชื่อภายนอก ชื่อของตารางที่มา ชื่อคอลเลกชันภายนอก คุณสามารถใช้ค่าเดียวกันจากคอลัมน์ชื่อพหูพจน์ได้ เลือก บันทึกและปิด
ในบานหน้าต่างนําทางด้านซ้าย เลือกและขยายบนตารางเสมือนที่คุณสร้างขึ้น
เลือก เขตข้อมูล เพื่ออัปเดตและสร้างคอลัมน์ใหม่ที่แสดงแหล่งที่มาภายนอก
เลือกคอลัมน์ คีย์หลัก สําหรับตารางเสมือน และเลือก แก้ไข
อัปเดตคอลัมน์ ชื่อภายนอก ให้ตรงกับชื่อคอลัมน์ในแหล่งข้อมูลภายนอกของคุณ ในตัวอย่างนี้ ชื่อคอลัมน์ภายนอกคือ TicketID
เลือก บันทึกและปิด
เลือกเขตข้อมูลชื่อสําหรับตารางเสมือน และเลือกแก้ไข
อัปเดตเขตข้อมูล ชื่อภายนอก ให้ตรงกับชื่อเขตข้อมูลในแหล่งข้อมูลภายนอกของคุณ ในตัวอย่างนี้ ชื่อคอลัมน์ภายนอกคือชื่อ
เลือก บันทึกและปิด
เลือก ใหม่ เพื่อสร้างคอลัมน์ใหม่ในตารางเสมือน คอลัมน์นี้จะแสดงคอลัมน์ความรุนแรงในแหล่งข้อมูลภายนอก
ป้อนข้อมูลต่อไปนี้สําหรับคอลัมน์ใหม่:
ชื่อคอลัมน์ ค่า ชื่อที่ใช้แสดง ความรุนแรง ชื่อ new_severity ชื่อภายนอก ความรุนแรง ข้อกําหนดของเขตข้อมูล ธุรกิจที่ต้องการ ชนิดข้อมูล จำนวนเต็ม
เลือก บันทึกและปิด
ขั้นตอนที่ 4: สร้าง อัปเดต ดู และลบเรกคอร์ดโดยใช้ตารางเสมือน
สร้างแอปที่ขับเคลื่อนด้วยแบบจําลองและเพิ่มตารางเสมือนลงในแผนผังเว็บไซต์ จากนั้นเลือกฟอร์มหลักของตารางเสมือนและมุมมองเขตข้อมูลขั้นสูง เผยแพร่แอป ข้อมูลเพิ่มเติม: สร้างแอปแบบจําลองข้อมูลแรกของคุณตั้งแต่เริ่มต้น
ผู้ใช้แอปพลิเคชันสามารถดําเนินการอ่านสร้างอัปเดตลบการดําเนินการโดยใช้ตารางเสมือนเช่นเดียวกับตารางอื่น ๆ ใน Microsoft Dataverse
ดูเพิ่มเติม
เริ่มต้นใช้งานตารางเสมือน
ข้อควรพิจารณาของ API สําหรับตารางเสมือน
ตัวให้บริการข้อมูลตารางเสมือนแบบกําหนดเอง
คําแนะนําตารางเสมือนโดยใช้ตัวให้บริการข้อมูล OData v4