Kesibukan “coding demi sesuap nasi” he he he :D, sempat membuat blog ini enggak keurus.
Untungnya ada beberapa pengunjung yang berbaik hati untuk meninggalkan komennya sehingga saya pun jadi rutin untuk mengecek blog ini.
Melakukan perubahan struktur database merupakan pekerjaan sampingan yang mau tidak mau harus kita terima dengan ikhlas jika membuat aplikasi terutama aplikasi masal, karena biasanya aplikasi tipe ini sering sekali terjadi perubahan untuk memenuhi kebutuhan klien.
Untuk contoh disini saya menggunakan database Firebird.
Firebird sendiri sudah menyediakan command line tool (isql) untuk mengeksekusi pernyataan DML (SELECT, INSERT, UPDATE dan DELETE), DDL (CREATE, DROP, ALTER) dan DCL (GRANT, REVOKE de el el).
Isql ini mirip dengan tool mysql, referensi lengkap tentang isql bisa dilihat disini.
Untuk menjalankan isql kita membutuhkan library fbclient.dll dan secara default kedua file ini biasanya ngumpul di folder “C:\Program Files\Firebird\Firebird_x_x\bin” jika Anda sudah menemukannya, copykan kedua file tersebut ke folder aplikasi Anda. Hal ini kita lakukan untuk menyederhanakan dalam penulisan kode program.
Kita ambil contoh kasus, misal pada saat rilis awal program kita mempunyai struktur tabel siswa seperti berikut :
kemudian terjadi perubahan struktur table siswa dengan adanya penambahan field NAMA_AYAH dan NAMA_IBU
perintah DDL yang kita gunakan untuk menambahkan kedua field tersebut adalah sebagai berikut :
1
2
ALTER TABLE SISWA ADD NAMA_AYAH VARCHAR(30);
ALTER TABLE SISWA ADD NAMA_IBU VARCHAR(30);
kemudian skrip diatas kita simpan dengan nama patchdb.sql
Sampai disini muncul masalah yaitu isql tidak bisa langsung mengeksekusi skrip diatas, agar skrip diatas bisa dieksekusi maka file patchdb.sql harus kita edit dengan menambahkan beberapa kode berikut :
1
2
SET SQL DIALECT 3;
CONNECT ‘C:\Program Files\SmartLibrary\DBSLS.FDB’ USER ‘SYSDBA’ PASSWORD ‘masterkey’; //masterkey adalah password default Firebird
sehingga isi akhir dari file patchdb.sql adalah sebagai berikut :
1
2
3
4
5
SET SQL DIALECT 3;
CONNECT ‘C:\Program Files\SmartLibrary\DBSLS.FDB’ USER ‘SYSDBA’ PASSWORD ‘masterkey’; //masterkey adalah password default Firebird
ALTER TABLE SISWA ADD NAMA_AYAH VARCHAR(30);
ALTER TABLE SISWA ADD NAMA_IBU VARCHAR(30);
Skrip diatas dengan asumsi lokasi database (DBSLS.FDB) satu folder dengan aplikasi utama. Oke sekarang saatnya kita mengeksekusi file patchdb.sql dengan memanfaatkan utility isql.
Untuk mencobanya tambahkan sebuah modul kemudian copy paste kode berikut selain itu tambahkan juga referensi Microsoft Scripting Runtime di project Anda :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
Option Explicit
Private Declare Function OpenProcess Lib “kernel32” (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function WaitForSingleObject Lib “kernel32” (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib “kernel32” (ByVal hObject As Long) As Long
Private Const SYNCHRONIZE As Long = &H100000
Private Const INFINITE As Long = &HFFFF
Private Const FILE_PATCH As String = “patchdb.sql”
Dim fso As Scripting.FileSystemObject
Private Function fileExists(ByVal namaFile As String) As Boolean
On Error GoTo errHandle
If Not (Len(namaFile) > 0) Then fileExists = False: Exit Function
Set fso = New Scripting.FileSystemObject
fileExists = fso.fileExists(namaFile)
Set fso = Nothing
Exit Function
errHandle:
fileExists = False
End Function
Private Sub patchDB()
Dim ShellX As Long
Dim lPid As Long
Dim lHnd As Long
Dim lRet As Long
Dim cmd As String
On Error GoTo errHandle
cmd = Chr(34) & App.Path & “\isql.exe ” & Chr(34) & “ -q -i ” & Chr(34) & App.Path & “\” & FILE_PATCH & Chr(34)
‘pastikan file isql.exe dan fbclient.dll ada di folder aplikasi
If fileExists(App.Path & “\isql.exe”) And fileExists(App.Path & “\fbclient.dll”) Then
'pastikan juga file patchdb.sql ada
If fileExists(App.Path & “\” & FILE_PATCH) Then
cmd = Chr(34) & App.Path & “\isql.exe ” & Chr(34) & “ -q -i ” & Chr(34) & App.Path & “\” & FILE_PATCH & Chr(34)
ShellX = Shell(cmd, vbHide)
lPid = ShellX
If lPid <> 0 Then
lHnd = OpenProcess(SYNCHRONIZE, 0, lPid)
If lHnd <> 0 Then
lRet = WaitForSingleObject(lHnd, INFINITE)
CloseHandle (lHnd)
End If
End If
End If
End If
Exit Sub
errHandle:
MsgBox Err.Description, vbExclamation, “Warning”
End Sub
Public Sub Main()
Call patchDB
End Sub
Pada contoh diatas penulisan kode :
1
CONNECT ‘C:\Program Files\SmartLibrary\DBSLS.FDB’ USER ‘SYSDBA’ PASSWORD ‘masterkey’;
masih hard-coding tentunya hal ini akan menyebabkan error jika aplikasi diinstall selain difolder “C:\Program Files\SmartLibrary”, jadi silahkan kembangkan sendiri untuk penyelesaiannya :smile:
Kesimpulannya dengan menggunakan metode sederhana seperti ini, setiap ada perubahan struktur database kita cukup mengirimkan file patchdb.sql yang berisi perubahan struktur database ke klien, gimana simple kan ?.
Selamat mencoba :)