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.
Anda dapat mengonfigurasi adaptor SQL untuk menerima pesan polling bertipe ketat dari SQL Server. Anda dapat menentukan pernyataan polling yang akan dijalankan adaptor untuk mengakses data dari database. Pernyataan polling dapat berupa pernyataan SELECT atau prosedur tersimpan yang mengembalikan tataan hasil. Anda harus menggunakan polling dengan tipe data yang kuat dalam skenario di mana Anda ingin menerima kumpulan hasil yang bertipe kuat. Untuk informasi selengkapnya tentang bagaimana adapter mendukung polling bertipe kuat, lihat Dukungan untuk Panggilan Masuk Menggunakan Polling.
Penting
Jika Anda ingin memiliki lebih dari satu operasi polling dalam satu aplikasi, Anda harus menentukan properti koneksi InboundID sebagai bagian dari URI koneksi untuk membuatnya unik. ID masuk yang Anda tentukan ditambahkan ke namespace operasi untuk membuatnya unik.
Cara Topik Ini Menunjukkan Polling
Dalam topik ini, untuk menunjukkan bagaimana adaptor SQL mendukung penerimaan pesan perubahan data bertipedata kuat, buat aplikasi .NET dan hasilkan kontrak layanan WCF untuk operasi TypedPolling. Pastikan Anda menentukan hal berikut saat membuat kontrak layanan WCF:
Anda harus menentukan InboundID sebagai bagian dari URI koneksi.
Anda harus menentukan pernyataan polling untuk properti pengikatan PollingStatement .
Selain itu, jika Anda ingin menentukan properti pengikatan terkait polling lainnya saat menghasilkan kelas proksi, tentukan PolledDataAvailableStatement sebagai:
SELECT COUNT(*) FROM Employee
PolledDataAvailableStatement harus mengembalikan set hasil dengan sel pertama yang mengandung nilai positif. Jika sel pertama tidak berisi nilai positif, adaptor tidak menjalankan pernyataan polling.
Sebagai bagian dari pernyataan polling, lakukan operasi berikut:
Pilih semua baris dari tabel Karyawan.
Jalankan prosedur tersimpan (MOVE_EMP_DATA) untuk memindahkan semua rekaman dari tabel Karyawan ke tabel EmployeeHistory.
Jalankan prosedur tersimpan (ADD_EMP_DETAILS) untuk menambahkan rekaman baru ke tabel Karyawan. Prosedur ini mengambil nama, penetapan, dan gaji karyawan sebagai parameter.
Untuk melakukan operasi ini, Anda harus menentukan hal berikut untuk properti pengikatan PollingStatement saat membuat kontrak layanan WCF dan kelas pembantu:
SELECT * FROM Employee;EXEC MOVE_EMP_DATA;EXEC ADD_EMP_DETAILS John, Tester, 100000
Setelah pernyataan polling dijalankan, semua rekaman dari tabel Karyawan dipilih dan pesan dari SQL Server diterima. Setelah prosedur tersimpan MOVE_EMP_DATA dijalankan oleh adaptor, semua rekaman dipindahkan ke tabel EmployeeHistory. Kemudian, prosedur tersimpan ADD_EMP_DETAILS dijalankan untuk menambahkan rekaman baru ke tabel Karyawan. Pelaksanaan polling berikutnya hanya akan mengembalikan satu catatan. Siklus ini berlanjut sampai Anda menutup host layanan.
Mengonfigurasi Polling Yang Diketik dengan Properti Pengikatan Adaptor SQL
Tabel berikut ini meringkas properti pengikatan adaptor SQL yang Anda gunakan untuk mengonfigurasi adaptor untuk menerima pesan perubahan data. Selain properti pengikatan PollingStatement , semua properti pengikatan lain yang tercantum di bagian ini diperlukan saat menjalankan aplikasi .NET. Anda harus menentukan properti pengikatan PollingStatement sebelum membuat kontrak layanan WCF TypedPolling operasi.
Properti Pengikatan | Deskripsi |
---|---|
InboundOperationType | Menentukan apakah Anda ingin melakukan operasi Polling, TypedPolling, atau Pemberitahuan masuk. Defaultnya adalah Polling. Untuk menerima pesan polling dengan tipe yang ketat, atur ini ke TypedPolling. |
PolledDataAvailableStatement | Menentukan pernyataan SQL yang dijalankan adaptor untuk menentukan apakah ada data yang tersedia untuk polling. Pernyataan SQL harus mengembalikan kumpulan hasil yang terdiri dari baris dan kolom. Hanya jika baris tersedia, pernyataan SQL yang ditentukan untuk properti pengikatan PollingStatement akan dijalankan. |
PollingIntervalInSeconds | Menentukan interval, dalam detik, di mana adaptor SQL menjalankan pernyataan yang ditentukan untuk properti pengikatan PolledDataAvailableStatement . Defaultnya adalah 30 detik. Interval polling menentukan interval waktu antara dua polling yang berurutan. Jika pernyataan dijalankan dalam interval yang ditentukan, adaptor menunggu waktu yang tersisa dalam interval. |
PollingStatement | Menetapkan pernyataan SQL untuk mengambil data dari tabel database SQL Server. Anda dapat menentukan pernyataan SELECT sederhana atau prosedur tersimpan untuk pernyataan polling. Defaultnya adalah null. Anda harus menentukan nilai untuk PollingStatement untuk mengaktifkan polling. Pernyataan polling dijalankan hanya jika ada data yang tersedia untuk polling, yang ditentukan oleh properti pengikatan PolledDataAvailableStatement . Anda dapat menentukan sejumlah pernyataan SQL yang dipisahkan oleh titik koma. Penting: Untuk TypedPolling, Anda harus menentukan properti pengikatan ini sebelum menghasilkan metadata. |
PollWhileDataFound | Menentukan apakah adaptor SQL mengabaikan interval polling dan terus menjalankan pernyataan SQL yang ditentukan untuk properti pengikatan PolledDataAvailableStatement , jika data tersedia dalam tabel yang sedang dijajaki. Jika tidak ada data yang tersedia dalam tabel, adaptor kembali untuk menjalankan pernyataan SQL pada interval polling yang ditentukan. Default adalah false. |
Untuk deskripsi properti ini yang lebih lengkap, lihat Membaca tentang properti pengikatan adaptor BizTalk Adapter untuk SQL Server. Untuk deskripsi lengkap tentang cara menggunakan adaptor SQL untuk polling SQL Server, baca lebih lanjut.
Mengonfigurasi Polling Bertipe-Kuat dalam Model Layanan WCF
Untuk menerima operasi Polling saat menggunakan model layanan WCF, Anda harus:
Buat kontrak layanan WCF (antarmuka) untuk operasi TypedPolling dari metadata yang diekspos oleh adaptor. Untuk melakukan ini, Anda dapat menggunakan Add Adapter Service Reference Visual Studio Plug-in. Saat membuat kontrak layanan WCF untuk contoh ini, pastikan:
Anda menentukan InboundID sebagai Karyawan.
Anda menentukan pernyataan polling untuk properti pengikatan PollingStatement . Untuk contoh ini, tentukan pernyataan polling sebagai:
SELECT * FROM Employee;EXEC MOVE_EMP_DATA;EXEC ADD_EMP_DETAILS John, Tester, 100000
Terapkan layanan WCF dari antarmuka ini.
Host layanan WCF ini menggunakan host layanan (System.ServiceModel.ServiceHost).
Tentang Contoh yang Digunakan dalam Topik ini
Contoh dalam topik ini mengambil data dari tabel Karyawan. Contohnya juga menggunakan prosedur tersimpan MOVE_EMP_DATA dan ADD_EMP_DETAILS. Skrip untuk menghasilkan artefak ini disediakan dengan sampel. Untuk informasi selengkapnya tentang sampel, lihat Sampel untuk adaptor SQL. Contoh, TypedPolling_ServiceModel, yang berdasarkan topik ini, juga disertakan bersama dengan contoh adaptor SQL.
Kontrak dan Kelas Layanan WCF
Anda dapat menggunakan Add Adapter Service Reference Plug-in untuk membuat kontrak layanan WCF (antarmuka) dan kelas pendukung untuk operasi TypedPolling . Untuk informasi selengkapnya tentang membuat kontrak layanan WCF, lihat Membuat Klien WCF atau Kontrak Layanan WCF untuk Artefak SQL Server.
Kontrak Layanan WCF (Antarmuka)
Kode berikut menunjukkan kontrak layanan (antarmuka) WCF yang dihasilkan untuk operasi TypedPolling .
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(Namespace="http://schemas.microsoft.com/Sql/2008/05/", ConfigurationName="TypedPolling_Employee")]
public interface TypedPolling_Employee {
// CODEGEN: Generating message contract since the wrapper namespace (https://schemas.microsoft.com/Sql/2008/05/TypedPolling/Employee) of message TypedPolling
// does not match the default value (https://schemas.microsoft.com/Sql/2008/05/)
[System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="TypedPolling")]
void TypedPolling(TypedPolling request);
}
Perjanjian Pesan
Namespace kontrak pesan dimodifikasi oleh parameter InboundID dalam URI koneksi, jika ditentukan. Dalam contoh ini, Anda menentukan ID masuk sebagai Karyawan. Pesan permintaan mengembalikan tataan hasil yang ditik dengan kuat.
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.MessageContractAttribute(WrapperName="TypedPolling", WrapperNamespace="http://schemas.microsoft.com/Sql/2008/05/TypedPolling/Employee", IsWrapped=true)]
public partial class TypedPolling {
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://schemas.microsoft.com/Sql/2008/05/TypedPolling/Employee", Order=0)]
public schemas.microsoft.com.Sql._2008._05.TypedPolling.Employee.TypedPollingResultSet0[] TypedPollingResultSet0;
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://schemas.microsoft.com/Sql/2008/05/TypedPolling/Employee", Order=1)]
public schemas.microsoft.com.Sql._2008._05.TypedPolling.Employee.TypedPollingResultSet1[] TypedPollingResultSet1;
public TypedPolling() {
}
public TypedPolling(schemas.microsoft.com.Sql._2008._05.TypedPolling.Employee.TypedPollingResultSet0[] TypedPollingResultSet0, schemas.microsoft.com.Sql._2008._05.TypedPolling.Employee.TypedPollingResultSet1[] TypedPollingResultSet1) {
this.TypedPollingResultSet0 = TypedPollingResultSet0;
this.TypedPollingResultSet1 = TypedPollingResultSet1;
}
}
Kelas Layanan WCF
Add Adapter Service Reference Plug-in juga menghasilkan file yang memiliki stub untuk kelas layanan WCF yang diterapkan dari kontrak layanan (antarmuka). Nama file SqlAdapterBindingService.cs. Anda dapat menyisipkan logika untuk memproses operasi TypedPolling langsung ke kelas ini. Kode berikut ini menunjukkan kelas layanan WCF yang dihasilkan oleh Plug-in Tambah Referensi Layanan Adaptor.
namespace SqlAdapterBindingNamespace {
public class SqlAdapterBindingService : TypedPolling_Employee {
// CODEGEN: Generating message contract since the wrapper namespace (https://schemas.microsoft.com/Sql/2008/05/TypedPolling/Employee) of message TypedPolling
// does not match the default value (https://schemas.microsoft.com/Sql/2008/05/)
public virtual void TypedPolling(TypedPolling request) {
throw new System.NotImplementedException("The method or operation is not implemented.");
}
}
}
Menerima Pesan Masuk Berjenis Kuat untuk Operasi Pengenjian
Bagian ini menyediakan instruksi tentang cara menulis aplikasi .NET untuk menerima pesan polling masuk yang diketik dengan kuat menggunakan adaptor SQL.
Gunakan Add Adapter Service Reference Plug-in untuk menghasilkan kontrak layanan WCF (antarmuka) dan kelas pembantu untuk operasi TypedPolling . Pastikan Anda menentukan hal berikut saat membuat kontrak layanan WCF untuk contoh ini:
Anda harus menentukan InboundID sebagai Karyawan.
Anda harus menentukan pernyataan polling untuk properti pengikatan PollingStatement . Untuk contoh ini, tentukan pernyataan polling sebagai:
SELECT * FROM Employee;EXEC MOVE_EMP_DATA;EXEC ADD_EMP_DETAILS John, Tester, 100000
Untuk informasi selengkapnya, lihat Membuat Klien WCF atau Kontrak Layanan WCF untuk Artefak SQL Server. Anda dapat secara opsional menentukan properti pengikatan saat membuat kontrak layanan dan kelas pembantu. Ini menjamin bahwa mereka diatur dengan benar dalam file konfigurasi yang dihasilkan.
Terapkan layanan WCF dari antarmuka dan kelas pembantu yang dihasilkan di langkah 1. Metode TypedPolling dari kelas ini dapat melemparkan pengecualian untuk membatalkan transaksi polling, jika terjadi kesalahan saat memproses data yang diterima dari operasi TypedPolling ; jika tidak, metode tidak mengembalikan apa pun. Anda harus mengaitkan kelas layanan WCF sebagai berikut:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
Dalam metode TypedPolling , Anda dapat mengimplementasikan logika aplikasi Anda secara langsung. Kelas ini dapat ditemukan di SqlAdapterBindingService.cs. Kode dalam contoh ini menggunakan subclass dari kelas SqlAdapterBindingService. Dalam kode ini, pesan polling yang diterima sebagai kumpulan hasil yang dititik kuat ditulis ke konsol.
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] public class PollingService : SqlAdapterBindingNamespace.SqlAdapterBindingService { public override void TypedPolling(TypedPolling request) { Console.WriteLine("\nNew Polling Records Received"); Console.WriteLine("*************************************************"); Console.WriteLine("Employee ID\tName\tDesignation\tSalary"); for (int i = 0; i < request.TypedPollingResultSet0.Length; i++) { Console.WriteLine("{0}\t{1}\t{2}\t{3}", request.TypedPollingResultSet0[i].Employee_ID, request.TypedPollingResultSet0[i].Name, request.TypedPollingResultSet0[i].Designation, request.TypedPollingResultSet0[i].Salary); } Console.WriteLine("*************************************************"); Console.WriteLine("\nHit <RETURN> to stop polling"); } }
Karena adaptor SQL tidak menerima kredensial sebagai bagian dari URI koneksi, Anda harus menerapkan kelas berikut untuk meneruskan kredensial untuk database SQL Server. Di bagian terakhir aplikasi, Anda akan membuat instans kelas ini untuk meneruskan kredensial SQL Server.
class PollingCredentials : ClientCredentials, IServiceBehavior { public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) { bindingParameters.Add(this); } public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { } public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { } protected override ClientCredentials CloneCore() { ClientCredentials clone = new PollingCredentials(); clone.UserName.UserName = this.UserName.UserName; clone.UserName.Password = this.UserName.Password; return clone; } }
Buat SqlAdapterBinding dan konfigurasikan operasi polling dengan menentukan properti pengikatan. Anda dapat melakukan ini baik secara eksplisit dalam kode atau secara deklaratif dalam konfigurasi. Minimal, Anda harus menentukan InboundOperationType, PolledDataAvailableStatement, dan PollingStatement.
SqlAdapterBinding binding = new SqlAdapterBinding(); binding.InboundOperationType = InboundOperation.TypedPolling; binding.PolledDataAvailableStatement = "SELECT COUNT (*) FROM EMPLOYEE"; binding.PollingStatement = "SELECT * FROM Employee;EXEC MOVE_EMP_DATA;EXEC ADD_EMP_DETAILS John, Tester, 100000";
Tentukan kredensial database SQL Server dengan menginstansiasi kelas PollingCredentials yang Anda buat di Langkah 3.
PollingCredentials credentials = new PollingCredentials(); credentials.UserName.UserName = "<Enter user name here>"; credentials.UserName.Password = "<Enter password here>";
Buat instans layanan WCF yang dibuat di langkah 2.
// create service instance PollingService service = new PollingService();
Buat instans System.ServiceModel.ServiceHost dengan menggunakan layanan WCF dan URI koneksi dasar. URI koneksi dasar tidak boleh berisi ID masuk. Anda juga harus menentukan kredensial di sini.
// Enable service host Uri[] baseUri = new Uri[] { new Uri("mssql://mysqlserver//mydatabase") }; ServiceHost serviceHost = new ServiceHost(service, baseUri); serviceHost.Description.Behaviors.Add(credentials);
Tambahkan titik akhir layanan ke host layanan. Untuk melakukan ini:
Gunakan pengikatan yang dibuat di langkah 4.
Tentukan URI koneksi yang berisi kredensial dan, jika diperlukan, ID masuk.
Tentukan kontrak sebagai "TypedPolling_Employee".
// Add service endpoint: be sure to specify TypedPolling_Employee as the contract Uri ConnectionUri = new Uri("mssql://mysqlserver//mydatabase?InboundID=Employee"); serviceHost.AddServiceEndpoint("TypedPolling_Employee", binding, ConnectionUri);
Untuk menerima data polling, buka host layanan. Adaptor akan mengembalikan data setiap kali kueri mengembalikan tataan hasil.
// Open the service host to begin polling serviceHost.Open();
Untuk mengakhiri polling, tutup host layanan.
Penting
Adaptor akan terus melakukan polling hingga host layanan ditutup.
serviceHost.Close();
Contoh
Contoh berikut menunjukkan kueri polling yang menjalankan tabel Karyawan. Pernyataan polling melakukan tugas-tugas berikut:
Memilih semua rekaman dari tabel Karyawan.
Menjalankan prosedur tersimpan MOVE_EMP_DATA untuk memindahkan semua rekaman dari tabel Karyawan ke tabel EmployeeHistory.
Menjalankan prosedur tersimpan ADD_EMP_DETAILS untuk menambahkan satu rekaman ke tabel Karyawan.
Pesan polling pertama akan berisi semua catatan di tabel Karyawan. Pesan polling berikutnya hanya akan berisi rekaman terakhir yang disisipkan oleh prosedur tersimpan ADD_EMP_DETAILS. Adaptor akan terus melakukan polling hingga Anda menutup host layanan dengan menekan
<RETURN>
.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Adapters.Sql;
using Microsoft.ServiceModel.Channels;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.ServiceModel.Channels;
using System.Collections.ObjectModel;
namespace TypedPolling_ServiceModel
{
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class PollingService : SqlAdapterBindingNamespace.SqlAdapterBindingService
{
public override void TypedPolling(TypedPolling request)
{
Console.WriteLine("\nNew Polling Records Received");
Console.WriteLine("*************************************************");
Console.WriteLine("Employee ID\tName\tDesignation\tSalary");
for (int i = 0; i < request.TypedPollingResultSet0.Length; i++)
{
Console.WriteLine("{0}\t{1}\t{2}\t{3}",
request.TypedPollingResultSet0[i].Employee_ID,
request.TypedPollingResultSet0[i].Name,
request.TypedPollingResultSet0[i].Designation,
request.TypedPollingResultSet0[i].Salary);
}
Console.WriteLine("*************************************************");
Console.WriteLine("\nHit <RETURN> to stop polling");
}
}
class PollingCredentials : ClientCredentials, IServiceBehavior
{
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
{
bindingParameters.Add(this);
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{ }
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{ }
protected override ClientCredentials CloneCore()
{
ClientCredentials clone = new PollingCredentials();
clone.UserName.UserName = this.UserName.UserName;
clone.UserName.Password = this.UserName.Password;
return clone;
}
}
class Program
{
static void Main(string[] args)
{
ServiceHost serviceHost = null;
try
{
Console.WriteLine("Sample started...");
Console.WriteLine("Press any key to start polling...");
Console.ReadLine();
SqlAdapterBinding binding = new SqlAdapterBinding();
binding.InboundOperationType = InboundOperation.TypedPolling;
binding.PolledDataAvailableStatement = "SELECT COUNT (*) FROM EMPLOYEE";
binding.PollingStatement = "SELECT * FROM Employee;EXEC MOVE_EMP_DATA;EXEC ADD_EMP_DETAILS John, Tester, 100000";
Console.WriteLine("Binding properties assigned...");
// This URI is used to specify the address for the ServiceEndpoint
// It must contain the InboundId that was used to generate
// the WCF service callback interface
Uri ConnectionUri = new Uri("mssql://mysqlserver//mydatabase?InboundId=Employee");
// This URI is used to initialize the ServiceHost. It cannot contain
// the InboundID; otherwise,an exception is thrown when
// the ServiceHost is initialized.
Uri[] baseUri = new Uri[] { new Uri("mssql://mysqlserver//mydatabase") };
PollingCredentials credentials = new PollingCredentials();
credentials.UserName.UserName = "<Enter user name here>";
credentials.UserName.Password = "<Enter password here>";
Console.WriteLine("Opening service host...");
PollingService service = new PollingService();
serviceHost = new ServiceHost(service, baseUri);
serviceHost.Description.Behaviors.Add(credentials);
serviceHost.AddServiceEndpoint("TypedPolling_Employee", binding, ConnectionUri);
serviceHost.Open();
Console.WriteLine("Service host opened...");
Console.WriteLine("Polling started...");
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine("Exception :" + e.Message);
Console.ReadLine();
/* If there is an error it will be specified in the inner exception */
if (e.InnerException != null)
{
Console.WriteLine("InnerException: " + e.InnerException.Message);
Console.ReadLine();
}
}
finally
{
// IMPORTANT: you must close the ServiceHost to stop polling
if (serviceHost.State == CommunicationState.Opened)
serviceHost.Close();
else
serviceHost.Abort();
}
}
}
}
Lihat Juga
Polling SQL Server menggunakan Adaptor SQL dengan Model Layanan WCF