Client-server adalah model komunikasi yang diterapkan dalam aplikasi komputer, dimana server disini berfungsi sebagai penyedia yang melayani kebutuhan client dalam hal ini khususnya data yang disimpan dalam database server. Aplikasinya sendiri dapat tersimpan pada komputer client. Database yang tersimpan pada server digunakan secara bersamaan oleh banyak user. Untuk itu diperlukan metodologi khusus yang menangani trafic agar terhindar dari tabrakan informasi yang menyebabkan informasi tidak berjalan sebagaimana mestinya.
Deleting
Jika sebuah record telah dihapus oleh seorang user (didalam tabel yang terdapat pada database server), dan user yang lain berusaha mengedit record tersebut (pada buffer recordsetnya), maka seharusnya ia akan mendapatkan pesan error untuk itu. Tetapi, tentu saja ini tergantung dari driver dan cursor type yang digunakan.
Jika kita telah mendapatkan pesan error tentang hal ini, maka mungkin kita ingin me-refresh kembali recordset tersebut. Tetapi dengan merefresh sebuah recordset dapat memberatkan beban kerja jaringan (network) dan tentu saja memperlambat kinerja aplikasi kita. Untuk itu ada beberapa macam “kontradiksi” ketika kita menangani hal ini:
Berikut ini adalah beberapa hal yang akan terjadi ketika kita berusaha menghapus sebuah record untuk Driver yang berbeda:
SQL Server Native - Kita tidak akan mendapatkan pessan error sama sekali
SQL Server ODBC - akan terjadi Deadlock
Access OLE DB Provider - segera memberi peringatan jika kita akan menghapus dan mengedit sebuah record pada saat yang bersamaan!
Adding
Kita harus ingat, bahwa didalam aplikasi Multi-User, banyak user yang secara bersamaan memanipulasi sebuah data (baik itu menambah, menghapus ataupun merubah data). Kita haruslah selalu mempersiapkan penanganan masalah ini karena sangat mempengaruhi integritas data yang terdapat pada database server kita seperti yang kita diskusikan sebelumnya. Ketika kita menambah sebuah record pada suatu object recordset, user lain tidak akan melihat penambahan tersebut kecuali jika ia menggunakan Dynamic cursor. User tersebut haruslah me-refresh kembali recordsetnya untuk melihat penambahan yang kita lakukan. Begitu juga sebaliknya.
Requery dan Resync
Ada 2 (dua) metode berbeda yang dapat kita gunakan untuk me-refresh kembali sebuah recordset. Metode Refresh( ) akan membentuk kembali semua isi dari recordset tersebut berdasarkan tabel/data yang dimintanya dari database server dengan menjalankan kembali perintah SQL untuk recordset tersebut. Metode Requery hanya akan me-refresh row-row tertentu saja yang kita inginkan. Sebagai contoh, kita dapat me-refresh data yang sedang diedit saja (current row) ataupun kesemua row (baris).
Checking Status Update Batch Locking
Jika salah satu dari data/row gagal di-update, maka kita dapat mencari tahu row yang gagal di-update tersebut. Untuk melakukan ini kita dapat menggunakan metode Filter yang terdapat didalam objek Recordset, passing sebuah konstanta spesial dan sebuah recordset baru yang berisi data yang gagal tersebut akan dibuat. Kita dapat memeriksa propertynya satu-per-satu untuk mencari tahu record/row mana yang gagal di-update.
Private Sub cmdCheck_Click()
Dim oRS As Recordset
Dim strSQL As String
On Error Resume Next
strSQL = “Select * FROM Karyawan Where Nama LIKE ‘S%’”
‘*** Gunakan Cursor Location = adUseClient
Set oRS = New Recordset
oRS.Open strSQL, oLogin.Connection, adOpenKeyset, adLockBatchOptimistic
Do Until oRS.EOF
Debug.Print oRS!Nama
‘Start Editing data
oRS!Tanggal_Masuk = Now
oRS!Status = 1
oRS!Concurency_id = 2
oRS!MoveNext
Loop
oRS.UpdateBatch
‘Kita dapat menggagalkannya dengan –> oRS.CancelBatch
If Err.Number Then
‘Sekarang periksa statusnya
Set oRS = oRS.Filter = adFilterAffectedRecords
oRS.MoveFirst
Do Until oRS.EOF
Debug.Print oRS!Nama
If oRS.Status <> adRecModified Then
MsgBox “Record ini tidak ter-update: ” & oRS!Nama
End If
oRS.MoveNext
Loop
End If
oRS.Close
End Sub
Prepared Statements
Stored Procedure yang terdapat didalam database server adalah sebuah statement SQL yang sudah di-compiled oleh Database server tersebut (pre-compiled SQL Statement). Statement tersebut sudah dipersiapkan dan ditentukan rencana eksekusinya (Execution Plan) oleh database engine. Tetapi setiap database server mempunyai mekanisme yang berbeda dalam menangani stored procedure, sehingga tidak begitu portable.
Dengan menggunakan ODBC API, RDO dan ADO, kita dapat membuat sebuah prepared statements yang mensimulasikan sebuah stored procedure. Perpared statement adalah sebuah statement SQL yang dibuat oleh Visual Basic dan dikirimkan ke database server untuk di-compile dan dieksekusi. Tetapi statement tersebut tidak akan “dibuang” oleh database server sampai connection diputus. Prepared statement sangat cocok digunakan untuk meng-eksekusi perintah SQL yang sering digunakan didalam aplikasi.
Perbedaan waktu eksekusi
Sekarang marilah kita lihat perbedaan waktu yang diperlukan oleh sebuah perintah SQL biasa vs prepared statement.
Private Sub cmdTimings_Click()
Dim cmdPrep As New Command
Dim cmdNonPrep As New Command
Dim connPrep As New Connection
Dim connNonPrep As New Connection
Dim strSQL As String
Dim sngStart As Single
Dim sngEnd As Single
Dim intLoop As Integer
Dim strConn As String
strConn = “Provider = sqloledb” & _
“;Data Source = (local)” & _
“;Initial Catalog = Barang” & _
“;User Id = sa” & tblOptions!UserID & _
“;Password = xxx”
Set connPrep = New ADODB.Connection
Set connNonPrep = New ADODB.Connection
Const conNumber As Integer = 100
‘Ingat: Gunakan 2 buah Connection yang berbeda untuk setiap statement
‘agar mendapatkan waktu yang akurat
Screen.MousePointer = vbHourglass
cmdTimings.Enabled = False
strSQL = “Select * FROM tblBarang”
‘Membuat Non-Prepared Command Object
connNonPrep.ConnectionString = strConn
connNonPrep.Open
With cmdNonPrep
Set .ActiveConnection = connNonPrep
.CommandText = strSQL
.Prepared = False
End With
‘Eksekusi SQL Statement (Looping) sebanyak 100 kali
sngStart = Timer
For intLoop = 1 To conNumber
cmdNonPrep.Execute
Next intLoop
sngEnd = Timer
msgBox “Waktu yang dibutuhkan adalah: ” & sngEnd – sngStart
Set cmdNonPrep.ActiveConnection = Nothing
Set cmdNonPrep = Nothing
‘Membuat Prepared Statements Command Object
connPrep.ConnectionString = strConn
connPrep.Open
With cmdPrep
Set .ActiveConnection = connPrep
.CommandText = strSQL
.Prepared = True
End With
‘Eksekusi SQL Statement (Looping) sebanyak 100 kali
sngStart = Timer
For intLoop = 1 To conNumber
cmdPrep.Execute
Next intLoop
sngEnd = Timer
msgBox “Waktu yang dibutuhkan adalah: ” & sngEnd – sngStart
Set cmdPrep.ActiveConnection = Nothing
Set cmdPrep = Nothing
Screen.MousePointer = vbDefault
cmdTimings.Enabled = True
End Sub
‘—————- END OF CODE ———————————–
Dengan menentukan property “Prepared = True” dari object Command, maka database server akan membuat stored procedure sementara dan menjaganya sampai sebuah connection terjadi (aktif).
Cara Penggunaan Prepared Statement
Sekarang mari kita coba untuk mempelajari penggunaan prepared statement didalam aplikasi yang akan kita kembangkan.
Sebagai contoh kita akan mengambil data dari tabel <Barang> dengan kriteria Kode_Barang = 1234
‘Initialisasi Variabel pada awal form coding
Option Explicit
Dim oRS As Recordset
Dim mcmdFind As ADODB.Command
‘Command button untuk mengambil data barang
Private Sub cmdShowBarang_Click()
‘Periksa status Recordset
If oRS.State = adStateOpen Then
oRS.Close
End If
‘Panggil prosedur untuk membentuk parameter prepared statement (pertama kali)
If mcmdFind.CommandText = “” Then
Call CmdFindBuild
End If
‘Bound Recordset dengan informasi yang didapat dari prepared statement
With mcmdFind
.Parameters(“KodeBarang”) = txtKodeBarang.Text
Set oRS = .Execute
End With
‘Menampilkan nama barang
If oRS.EOF Then
MsgBox “Data tidak ada”
Else
txtNama.Text = oRS!Nama_Barang
End If
End Sub
Private Sub CmdFindBuild()
Dim strSQL As String
Dim oParam As ADODB.Parameter
‘membentukl statement SQL
strSQL = “SELECT Nama_Barang FROM Barang “
strSQL = “WHERE Kode_Barang = ?”
‘building prepared statement
With mcmdFind
.CommandText = strSQL
.Prepared = True
.CommandType = adCmdText
Set oParam = .CreateParameter(“KodeBarang”, adInteger, adParamInput, 4)
.Parameters.Append oParam
Set .ActiveConnection = goLogin.Connection
End With
End Sub
Private Sub Form_Unload(Cancel As Integer)
oRS.Close
Set mcmdFind = Nothing
End Sub
‘—————- END OF CODE ———————————–
Untuk membuat suatu prepared statement, kita cukup membuat sebuah statement SQL biasa dengan satu atau beberapa parameter, kemudian mengirimkannya ke database melalui properti CommandText pada objek Command. Kita juga harus men-setting property ActiveConnection ke objek Connection yang sedang aktif dan property Prepared = True untuk menggunakan prepared statement.
Parameter dibentuk dengan menggunakan tanda “tanya” (?) untuk kriteria yang kita inginkan. Pada contoh listing diatas kita tanda tanya (?) berfungsi untuk menggantikan nilai Kode_Barang yang akan kita cari.
Untuk menggantikan parameter (?) pada statment SELECT, kita menggunakan koleksi Parameters untuk mengisi nilai yang kita inginkan. Parameter dimulai dari 0 dan bertambah 1 (satu) untuk setiap tanda tanya (?) yang dijumpai didalam SQL Statement. Jika kita menggunakan metode CreateParameter() maka kita dapat menentukan nama parameter yang kita pakai dibandingkan nilai dari posisinya.
Modifikasi Data dengan Prepared Statement
Prepared statement dapat juga kita gunakan untuk melakukan modifikasi terhadap data, INSERT, UPDATE dan DELETE Statement.
Sekarang marilah kita lihat contoh penggunaan INSERT dengan prepared statement:
Private Sub CmdAddBuild()
Dim strSQL As String
Dim oParam As ADODB.Parameter
‘Insert Statement for Tabel Barang
strSQL = “INSERT INTO Barang(“
strSQL = strSQL & “KodeBarang, “
strSQL = strSQL & “NamaBarang, “
strSQL = strSQL & “Harga “
strSQL = strSQL & “) VALUES (?, ?, ?)”
With mcmdAdd
.CommandText = strSQL
.Prepared = True
.CommandType = adCmdText
Set oParam = .CreateParameter(“KodeBarang”, adInteger, adParamInput, 4)
.Parameters.Append oParam
Set oParam = .CreateParameter(“NamaBarang”, adChar, adParamInput, 100)
.Parameters.Append oParam
Set oParam = .CreateParameter(“Harga”, adCurrency, adParamInput, ![]()
.Parameters.Append oParam
Set .ActiveConnection = goLogin.Connection
End With
End Sub
‘—————- END OF CODE ———————————–
Didalam procedure CmdAddBuild() diatas dapat kita lihat statement INSERT dengan beberapa tanda tanya (?). Kita harus membuat satu buah tanda tanya untuk setiap parameter yang akan kita masukkan. Untuk setiap parameter, kita harus menspesifikasikan nama, datatype, ukuran data dan jenis input/output parameter tersebut.
Sedangkan untuk melakukan UPDATE data, kita akan membuat procedure yang hampir sama seperti statment INSERT:
Private Sub CmdUpdateBuild()
Dim strSQL As String
Dim oParam As ADODB.Parameter
‘Update Statement for Tabel Barang
strSQL = “UPDATE Barang SET “
strSQL = strSQL & “NamaBarang = ?, “
strSQL = strSQL & “Harga = ? “
strSQL = strSQL & “WHERE KodeBarang = ?”
With mcmdUpdate
.CommandText = strSQL
.Prepared = True
.CommandType = adCmdText
Set oParam = .CreateParameter(“NamaBarang”, adChar, adParamInput, 100)
.Parameters.Append oParam
Set oParam = .CreateParameter(“Harga”, adCurrency, adParamInput, ![]()
.Parameters.Append oParam
Set oParam = .CreateParameter(“KodeBarang”, adInteger, adParamInput, 4)
.Parameters.Append oParam
Set .ActiveConnection = goLogin.Connection
End With
End Sub
‘—————- END OF CODE ———————————–
Untuk menyimpan data menggunakan command object-command object diatas, maka kita harus mengisi setiap nilai parameter yang terdapat didalam procedure diatas, seperti:
Private Function FormAdd() As Boolean
Dim lngRecords As Long
On Error GoTo Error_EH
If mcmdAdd.CommandText = “” Then
Call CmdAddBuild
End IF
With mcmdAdd
.Parameters(“KodeBarang”) = 12345
.Parameters(“NamaBarang”) = “Buku Komputer”
.Parameters(“Harga”) = 125000
.Execute lngRecords
If lngRecords = 0 Then
Msgbox “Error adding record!”
FormAdd = False
Else
FormAdd = True
End If
End With
Exit Function
Error_EH:
FormAdd = False
MsgBox goLogin.ErrorHandler
Exit Function
End Function
‘—————- END OF CODE ———————————–
Setelah mengisi setiap parameter yang terdapat didalam command object dengan nilai yang diinginkan, selanjutnya kita dapat menggunakan metode EXECUTE untuk mengeksekusi statement SQL (INSERT) yang kita inginkan. Kirimkan variabel lngRecords sebagai referensi apakah data yang kita masukkan berhasil ditambah (>1) atau tidak (=0).
Jangan lupa untuk menutup command object yang telah kita gunakan:
Private Sub Form_Unload(Cancel As Integer)
oRS.Close
Set mcmdFind = Nothing
Set mcmdAdd = Nothing
Set mcmdUpdate = Nothing
End Sub
‘—————- END OF CODE ———————————–
Command Objects dan Stored Procedures
Ada 2 macam metode yang digunakan untuk memanggil stored procedures pada ADO. Kita dapat menggunakan syntax pemanggilan yang terdapat didalam ODBC, atau dengan mempergunakan ‘command object’. Dibawah ini adalah syntax untuk membangun sebuah Recordset langsung dari syntax pemanggilan ODBC.
Private Sub cmdRS_Click()
Dim oRS As New ADODB.Recordset
Dim strSQL As String
‘Build SQL for loading list box
strSQL = “EXEC procViewBarang”
oRS.Open strSQL, goLogin.Connection, _
adOpenForwardOnly, _
adLockReadOnly, _
adCmdStoredProc
Do Until oRS.EOF
With lstBarang
.AddItem oRS!Kode_Barang & “, ” & oRS!Nama_Barang
.ItemData(.NewIndex) = oRS!ID_Barang
End With
oRS.MoveNext
Loop
oRS.Close
End Sub
‘—————- END OF CODE ———————————–
Sedangkan metode ke-dua adalah dengan menggunakan Command Object:
Private Sub cmdCommand_Click()
Dim oCmd As New ADODB.Command
Dim oRS As New ADODB.Recordset
‘Build Command Object
With oCmd
Set .ActiveConnection = goLogin.Connection
.CommandType = adCmdStoredProc
.CommandText = “procViewBarang”
.Parameters.Append .CreateParameter(“Kode_Barang”, adChar, adParamInput, 10)
.Parameters(“Kode_Barang”).Value = txtKodeBarang.Text
End With
Set oRS = oCmd.Execute
Do Until oRS.EOF
With lstBarang
.AddItem oRS!Kode_Barang & “, ” & oRS!Nama_Barang
.ItemData(.NewIndex) = oRS!ID_Barang
End With
oRS.MoveNext
Loop
oRS.Close
End Sub
‘—————- END OF CODE ———————————–
SUMMARY
Pada chapter ini kita telah mempelajari bagaimana cara menggunakan Command Object yang dikombinasikan dengan Stored Procedures. Kita belajar bagaimana caranya mem-passing parameter kedalam sebuah command object dan juga bagaimana membuat sebuah ‘temporary’ stored procedures.
DIarsipkan di bawah: Database, Pemrograman, Tutorial








