Bekerja dengan pemberitahuan kueri

Berlaku untuk:SQL Server

Unduh driver OLE DB

Pemberitahuan kueri diperkenalkan di driver SQL Server 2005 (9.x) dan OLE DB untuk SQL Server. Dibangun di atas infrastruktur SQL Service Broker yang diperkenalkan pada SQL Server 2005 (9.x), pemberitahuan kueri memungkinkan aplikasi untuk diberi tahu ketika data telah berubah. Fitur ini berguna untuk aplikasi yang menyediakan cache informasi dari database, seperti aplikasi web, dan perlu diberi tahu ketika data sumber diubah.

Dengan menggunakan pemberitahuan kueri, Anda dapat meminta pemberitahuan dalam periode batas waktu tertentu saat data yang mendasar kueri berubah. Permintaan menentukan opsi pemberitahuan, yang mencakup nama layanan, teks pesan, dan nilai batas waktu ke server. Pemberitahuan dikirimkan melalui antrean Service Broker bahwa aplikasi dapat melakukan polling untuk pemberitahuan yang tersedia.

Sintaksis string opsi pemberitahuan kueri adalah:

service=<service-name>[;(local database=<database> | broker instance=<broker instance>)]

Contohnya:

service=mySSBService;local database=mydb

Langganan pemberitahuan melampaui proses yang memulainya. Itu karena aplikasi dapat membuat langganan pemberitahuan lalu berakhir. Langganan tetap valid, dan pemberitahuan terjadi jika data berubah dalam periode batas waktu yang ditentukan. Pemberitahuan diidentifikasi oleh kueri yang dijalankan, opsi pemberitahuan, dan teks pesan. Anda dapat membatalkannya dengan mengatur nilai batas waktunya ke nol.

Pemberitahuan dikirim hanya sekali. Untuk terus diberi tahu tentang perubahan data, buat langganan baru dengan menjalankan kembali kueri setelah setiap pemberitahuan diproses.

Driver OLE DB untuk aplikasi SQL Server biasanya menerima pemberitahuan dengan menggunakan perintah Transact-SQL RECEIVE. Ini menggunakan perintah ini untuk membaca pemberitahuan dari antrean yang terkait dengan layanan yang ditentukan dalam opsi pemberitahuan.

Catatan

Nama tabel harus memenuhi syarat dalam kueri yang pemberitahuannya diperlukan. Contohnya:dbo.myTable Nama tabel harus memenuhi syarat dengan nama dua bagian. Langganan tidak valid jika nama tiga atau empat bagian digunakan.

Infrastruktur pemberitahuan dibangun di atas fitur antrean yang diperkenalkan pada SQL Server 2005 (9.x). Secara umum, pemberitahuan yang dihasilkan di server dikirim melalui antrean ini, untuk diproses nanti.

Untuk menggunakan pemberitahuan kueri, antrean dan layanan harus ada di server. Item ini dapat dibuat dengan menggunakan perintah Transact-SQL, mirip dengan yang berikut:

CREATE QUEUE myQueue
CREATE SERVICE myService ON QUEUE myQueue
([https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification])

Catatan

Layanan harus menggunakan kontrak yang telah ditentukan sebelumnya, seperti yang ditunjukkan di atas.

Menggunakan ADO dengan Driver OLE DB untuk SQL Server

Driver OLE DB untuk SQL Server mendukung pemberitahuan konsumen setelah modifikasi set baris. Konsumen menerima pemberitahuan di setiap fase modifikasi set baris dan pada setiap upaya perubahan.

Catatan

Meneruskan kueri pemberitahuan ke server dengan ICommand::Execute adalah satu-satunya cara yang valid untuk berlangganan pemberitahuan kueri dengan Driver OLE DB untuk SQL Server.

kumpulan properti DBPROPSET_SQLSERVERROWSET

Untuk mendukung pemberitahuan kueri melalui OLE DB, Driver OLE DB untuk SQL Server menambahkan properti baru berikut ke DBPROPSET_SQLSERVERROWSET kumpulan properti.

Nama Jenis Deskripsi
SSPROP_QP_NOTIFICATION_TIMEOUT VT_UI4 Jumlah detik pemberitahuan kueri akan tetap aktif.

Defaultnya adalah 432.000 detik (5 hari). Nilai minimum adalah 1 detik, dan nilai maksimum adalah 2^31-1 detik.
SSPROP_QP_NOTIFICATION_MSGTEXT VT_BSTR Teks pesan pemberitahuan. Teks ini ditentukan pengguna dan tidak memiliki format yang telah ditentukan sebelumnya.

Secara default, string kosong. Tentukan pesan dengan menggunakan 1 hingga 2000 karakter.
SSPROP_QP_NOTIFICATION_OPTIONS VT_BSTR Opsi pemberitahuan kueri. Opsi ini ditentukan dalam string dengan sintaksnilainama=. Pengguna bertanggung jawab untuk membuat layanan dan membaca pemberitahuan dari antrean.

Defaultnya adalah string kosong.

Langganan pemberitahuan selalu diterapkan. Hal ini terjadi terlepas dari apakah pernyataan berjalan dalam transaksi pengguna atau dalam autocommit atau apakah transaksi di mana pernyataan berjalan diterapkan atau digulung balik. Pemberitahuan server diaktifkan pada salah satu kondisi pemberitahuan yang tidak valid berikut: perubahan data atau skema yang mendasar, atau ketika periode batas waktu tercapai; mana saja yang pertama.

Pendaftaran pemberitahuan dihapus segera setelah dipecat. Jadi, setelah menerima pemberitahuan, aplikasi harus berlangganan lagi jika Anda ingin mendapatkan pembaruan lebih lanjut.

Koneksi atau utas lain dapat memeriksa antrean tujuan untuk pemberitahuan. Contohnya:

WAITFOR (RECEIVE * FROM MyQueue); -- Where MyQueue is the queue name.

Catatan

SELECT * tidak menghapus entri dari antrean. Namun, RECEIVE * FROM tidak. Ini menunda utas server jika antrean kosong. Jika ada entri antrean pada saat panggilan, entri tersebut akan segera dikembalikan. Jika tidak, panggilan menunggu hingga entri antrean dilakukan.

RECEIVE * FROM MyQueue

Pernyataan ini segera mengembalikan tataan hasil kosong jika antrean kosong. Jika tidak, ia mengembalikan semua pemberitahuan antrean.

Jika SSPROP_QP_NOTIFICATION_MSGTEXT dan SSPROP_QP_NOTIFICATION_OPTIONS tidak null dan tidak kosong, header TDS pemberitahuan kueri yang berisi tiga properti yang ditentukan di atas dikirim ke server. Header ini dikirim dengan setiap eksekusi perintah. Jika salah satunya null (atau kosong), header tidak dikirim dan DB_E_ERRORSOCCURRED dinaikkan (atau DB_S_ERRORSOCCURRED dinaikkan, jika properti keduanya ditandai sebagai opsional). Nilai status kemudian diatur ke DBPROPSTATUS_BADVALUE. Validasi terjadi setelah dijalankan dan disiapkan. Demikian pula, DB_S_ERRORSOCCURED dimunculkan ketika properti pemberitahuan kueri diatur untuk koneksi ke versi SQL Server sebelum SQL Server 2005 (9.x). Nilai status dalam hal ini adalah DBPROPSTATUS_NOTSUPPORTED.

Memulai langganan tidak menjamin bahwa pesan di masa mendatang akan berhasil dikirimkan. Selain itu, tidak ada pemeriksaan yang dilakukan untuk validitas nama layanan yang ditentukan.

Catatan

Menyiapkan pernyataan tidak akan pernah menyebabkan langganan dimulai. Hanya eksekusi pernyataan yang akan mencapai inisiasi. Pemberitahuan kueri tidak terpengaruh oleh penggunaan layanan inti OLE DB.

Untuk informasi selengkapnya tentang DBPROPSET_SQLSERVERROWSET kumpulan properti, lihat Properti dan Perilaku Kumpulan Baris.

Lihat juga

Driver OLE DB untuk Fitur SQL Server