Data Changed Event Pada SQL Server 2008 R2 Dan Visual Basic
Data Changed Event Pada SQL Server 2008 R2 Dan Visual Basic
Bagaimana cara menerima event bahwa ada data yang berubah pada tabel SQL Server 2008 R2?
Apakah dengan menggunakan komponen Timer dan melakukan loading data secara terus menerus?
Bukankah lebih baik loading data hanya jika terjadi perubahan pada data saja?
Yuk kita eksperimen!
Hai, sebelum kita mulai pembahasan, apa ada yang tahu maksud/arti dari Data Changed Event pada
konteks ini? Jika belum, ini adalah sedikit penjelasannya :
Data Changed Event (atau peristiwa perubahan data) adalah sebuah event atau
peristiwa perubahan data pada DBMS, entah itu INSERT, UPDATE, DELETE, ALTER,
DROP, atau perintah lainnya di eksekusi pada basis data dan menghasilkan
perubahan.
Event ini bisa diimplementasikan melalui Service Broker dengan menambahkan Queue dan Service.
Secara umum, event ini termasuk pada skema Query Notifications.
Penjelasannya sepertinya cukup, untuk keterangan lebih lanjut bisa membaca dokumentasinya di
MSDN.
Sebelum Memulai
Ada beberapa hal yang perlu Anda perhatikan sebelum menggunakan kelas SqlDependecy dan
Service Broker, yaitu :
Kelas SqlDependecy hanya menerima Query (yang sudah berada didalam SqlCommand) yang
merupakan perintah SELECT.
Perintah SELECT TIDAK MENERIMA KARAKTER ASTERISK (*). Jadi Anda harus menyebutkan
kolom yang akan dipilih. Contoh :
SELECT * FROM dbo.[tblSiswa]
Salah
Benar
Penulisan nama tabel juga lebih baik menggunakan format owner.TableName, seperti
pada contoh ini : dbo.[tblSiswa]. Format ini digunakan untuk mencegah adanya kekeliruan
data.
SANGAT DIANJURKAN MENGGUNAKAN STORED PROCEDURE daripada menggunakan
Query SQL langsung melalui SqlCommand. Jangan lupa set SET NOCOUNT ON;.
Pada contoh ini, kita menggunakan database dengan nama DatabasePercobaan dan tabel tblSiswa.
Untuk membuat database ini, Anda bisa menjalankan Query Transact-SQL dibawah ini :
USE [DatabasePercobaan]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[tblSiswa](
[Nama] [varchar](50) NULL,
[Kelas] [varchar](50) NULL,
[Hobi] [varchar](50) NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
Catatan: Query yang ditulis tanpa jarak baris ditulis satu baris. Contoh :
CREATE SERVICE svcPerubahanData ON QUEUE qwPerubahanData
([http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]);
Pada Query diatas pada baris GRANT SUBSCRIBE QUERY NOTIFICATIONS TO [uname];,
ubahlah [uname] menjadi nama pengguna pada SQL Server Anda. Tapi, jika Anda menggunakan login
bawaan dari SQL Server (misalnya sa atau menggunakan Windows Authentication), maka baris
diatas boleh dihapus, sehingga Query-nya menjadi :
USE DatabasePercobaan;
CREATE QUEUE qwPerubahanData;
CREATE SERVICE svcPerubahanData ON QUEUE qwPerubahanData
([http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]);
ALTER DATABASE DatabasePercobaan SET ENABLE_BROKER;
Algoritma Program
Sebelmum memulai menulis kode program, kita harus merencanakan algoritma pemrogramannya
terlebih dahulu.
1. Buat sebuah form untuk menampilkan data dan menerima event dari SQL Server.
2. Buat prosedur untuk menginisialisasi kelas SqlDependecy dan load data dari database.
3. Karena kelas SqlDependecy hanya akan fire event OnChange sekali, jadi, prosedur diatas
harus diulang dan reset Event Handler untuk objek SqlDependecy yang lama.
4. Setelah diatas menjelaskan logika untuk memonitor perubahan data, maka kita juga harus
membuat logika untuk melakukan perintah CRUD yang lain pada database (disini contohnya
hanya INSERT).
5. Untuk logika menambahkan record pada database pasti Anda sudah mengerti.
Return
End If
'Perintah Stop dan Start digunakan untuk Reset SqlDependecy.
SqlDependency.Stop(cs)
SqlDependency.Start(cs)
'Buat sebuah koneksi ke SQL Server
Dim cn As New SqlConnection(cs)
cn.Open()
'Buat perintah SELECT untuk dieksekusi saat
'terjadi perubahan data.
Dim cmd As SqlCommand = cn.CreateCommand
cmd.CommandType = CommandType.Text
cmd.CommandText = "SELECT Nama, Kelas, Hobi FROM dbo.[tblSiswa]"
cmd.Notification = Nothing 'Harus di set ke Nothing
'Buat ulang instance SqlDependecy, karena kelas ini
'hanya dapat melakukan event sekali.
SQL_Event = New SqlDependency(cmd)
AddHandler SQL_Event.OnChange, AddressOf SQL_DataChanged 'Buat Event
Handler
'Masukan data dari SQL Server
Dim dt As New DataTable
dt.Load(cmd.ExecuteReader)
DataGridView1.DataSource = dt
'Release semua memory.
cn.Dispose()
cmd.Dispose()
End Sub
Private Sub SQL_DataChanged(ByVal sender As Object, ByVal e As
SqlNotificationEventArgs)
'Karena SqlDependecy menggunakan Asynchronious Processing,
'jadi harus ditambahkan pengecekan Safe Cross-Thread.
If Me.InvokeRequired Then
'Jika membutuhkan Invoke, lakukan Invoke.
DataGridView1.BeginInvoke(New MethodInvoker(AddressOf CekDataBaru))
Else
'Jika tidak dibutuhkan Invoke, langsung saja panggil prosedur diatas.
CekDataBaru()
End If
'Karena SqlDependecy hanya bisa melakukan satu kali Event,
'jadi kita perlu melepaskan Event Handler dan mengulang
'proses membuat Event Handler (melalui prosedur CekDataaBaru().
Dim ev As SqlDependency = DirectCast(sender, SqlDependency)
RemoveHandler ev.OnChange, AddressOf SQL_DataChanged
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
'Tampilkan form tambah data.
frmTambahData.Show()
End Sub
End Class
End Try
End Function
Friend cs As String = "Server=MUZCOM_PCPC\SQLEXPRESS;Database=DatabasePercobaan;User Id=sa;Password=fahminlb33"
End Module
Anda harus mengubah nilai variabel cs ke Connection String yang cocok pada komputer Anda
masing-masing.
Penutup
Karena sekarang sudah tahu bagaimana cara menggunakan SqlDependecy, semoga bisa bermanfaat
bagi Anda semua.
Keuntungan yang sudah terbukti dengan menggunakan SqlClient :
1. Lower CPU usage, yap! Sudah pasti. Khususnya pada pihak server. Kenapa? Proses load data
hanya terjadi jika ada perubahan data. Jadi tidak memerlukan Timer untuk load data pada
interval tertentu.
2. More performance, karena program kita tidak perlu melakukan loading data setiap saat.
3. Safe your Bandwidth! Menghemat Bandwidth server karena? Yah, masih belum tau? :P
Jangan lupa lihat batasan SqlDependecy di MSDN!
Kode di form tampilan data bisa dipakai di proyek Anda dengan hanya mengubah Query SQL pada
SqlCommand untuk mengambil data dari tabel yang Anda inginkan.
Kirimkan kritik dan saran ke : [email protected] atau ke www.facebook.com/fahmi.noorfiqri.