COM DLL Akses MySQL – Bagian 5: Implementasi Kode Program

Tulisan ini merupakan bagian dari panduan membuat COM DLL (ATL) di Visual Studio 2010 yang mengakses MySQL atas request Albert Antonius:

Bila kamu masih bingung mempraktekkan langkah-langkah yang ada disini, baca dulu bagian 1 sampai 3. Buka Visual Studio 2010, buat sebuah proyek ATL baru dengan nama LatihanCRUDMahasiswa.  Lakukan pengaturan proyek seperti yang tunjukkan di artikel bagian 2. Tambahkan sebuah ATL Simple Object dengan nama Mahasiswa (short name).  Beri nilai ProgID dengan Jocki.Mahasiswa. Pada interface IMahasiswa, tambahkan property seperti berikut ini:

  • Property type bernilai BSTR dan Property name bernilai NIM.
  • Property type bernilai BSTR dan Property name bernilai Nama.
  • Property type bernilai int dan Property name bernilai TahunMasuk.

Tambahkan 3 variabel private di CMahasiswa, seperti berikut ini:

  • Variable type bernilai BSTR dan Variable name bernilai nim.
  • Variable type bernilai BSTR dan Variable name bernilai nama.
  • Variable type bernilai int dan Variable name bernilai tahunMasuk.

Buka file Mahasiswa.cpp dan lakukan modifikasi pada isi method hingga method yang ada memiliki isi seperti berikut ini:

STDMETHODIMP CMahasiswa::get_NIM(BSTR* pVal)
{
	CComBSTR bstr(nim);
	*pVal = bstr.Detach();
	return S_OK;
}

STDMETHODIMP CMahasiswa::put_NIM(BSTR newVal)
{
	CComBSTR bstr;
	bstr.Empty();
	bstr.AppendBSTR(newVal);
	nim = bstr.Detach();
	return S_OK;
}

STDMETHODIMP CMahasiswa::get_Nama(BSTR* pVal)
{
	CComBSTR bstr(nama);
	*pVal = bstr.Detach();
	return S_OK;
}

STDMETHODIMP CMahasiswa::put_Nama(BSTR newVal)
{
	CComBSTR bstr;
	bstr.Empty();
	bstr.AppendBSTR(newVal);
	nama = bstr.Detach();
	return S_OK;
}

STDMETHODIMP CMahasiswa::get_TahunMasuk(int* pVal)
{
	*pVal = tahunMasuk;
	return S_OK;
}

STDMETHODIMP CMahasiswa::put_TahunMasuk(int newVal)
{
	tahunMasuk = newVal;
	return S_OK;
}

Class Mahasiswa cukup hanya sampai disini saja.  Bila kamu kode program yang lebih praktis, kamu bisa mendeklarasikan nim dan nama dengan tipe CComBSTR (anggap saja latihan buat kamu!) Sekarang, buat sebuah ATL Simple Object dengan nama MahasiswaService (short name) dan beri nilai ProgID dengan Jocki.MahasiswaService. Pada interface IMahasiswaService, tambahkan method:

  • Method name berupa Inisialisasi, mengandung parameter [in] BSTR user, [in] BSTR password, dan [in] BSTR namaDatabase.
  • Method name berupa SimpanMahasiswa, mengandung parameter [in] BSTR nim, [in] BSTR nama, dan [in] int tahunMasuk.
  • Method name berupa HapusMahasiswa, mengandung parameter [in] BSTR nim.
  • Method name berupa CariMahasiswaByNIM, mengandung parameter [in] BSTR nim dan [out, retval] IMahasiswa** ret.
  • Method name berupa Refresh.  Tidak mengandung parameter.

Coba buka isi file LatihanCRUDMahasiswa.idl, kamu harusnya menemukan bagian seperti berikut ini:

interface IMahasiswaService : IDispatch{
	[id(1)] HRESULT Inisialisasi([in] BSTR user, [in] BSTR password, [in] BSTR namaDatabase);
	[id(2)] HRESULT SimpanMahasiswa([in] BSTR nim, [in] BSTR nama, [in] int tahunMasuk);
	[id(3)] HRESULT HapusMahasiswa([in] BSTR nim);
	[id(4)] HRESULT Refresh(void);	
	[id(5)] HRESULT CariMahasiswaByNIM([in] BSTR nim, [out,retval] IMahasiswa** ret);
};

Sekarang, kamu akan menambahkan property baru secara manual dengan mengetik sehingga bagian di atas akan terlihat seperti berikut ini:

interface IMahasiswaService : IDispatch{
	[id(1)] HRESULT Inisialisasi([in] BSTR user, [in] BSTR password, [in] BSTR namaDatabase);
	[id(2)] HRESULT SimpanMahasiswa([in] BSTR nim, [in] BSTR nama, [in] int tahunMasuk);
	[id(3)] HRESULT HapusMahasiswa([in] BSTR nim);
	[id(4)] HRESULT Refresh(void);	
	[id(5)] HRESULT CariMahasiswaByNIM([in] BSTR nim, [out,retval] IMahasiswa** ret);
	[propget, id(DISPID_VALUE)] HRESULT Item([in] long n, [out, retval] IMahasiswa** ret);
	[propget, id(DISPID_NEWENUM)] HRESULT _NewEnum([out, retval] IUnknown** pVal);
};

Property Item dan _NewEnum dibutuhkan untuk membaca setiap record Mahasiswa yang ada.

Sekarang buka file MahasiswaService.h, tambahkan bagian berikut setelah #include "resource.h":

#include "Mahasiswa.h"
#include "mysql_connection.h"
#include <cppconn\driver.h>
#include <cppconn\exception.h>
#include <cppconn\prepared_statement.h>
#include <cppconn\statement.h>
using namespace sql;

Berikutnya, tambahkan private variable berikut ke dalam class CMahasiswaService:

  • Variable type: Driver* dan Variable name: driver.
  • Variable type: Connection* dan Variable name: cn.
  • Variable type: Statement* dan Variable name: stmt.
  • Variable type: PreparedStatement* dan Variable name: psInsert.
  • Variable type: PreparedStatement* dan Variable name: psUpdate.
  • Variable type: PreparedStatement* dan Variable name: psDelete.
  • Variable type: PreparedStatement* dan Variable name: psSelectByNIM.
  • Variable type: PreparedStatement* dan Variable name: psSelectAll.

Buka file MahasiswaService.cpp, lalu modifikasi implementasi method CMahasiswaService::Inisialisasi()sehingga terlihat seperti berikut ini:

STDMETHODIMP CMahasiswaService::Inisialisasi(BSTR user, BSTR password, BSTR namaDatabase)
{
	// Bila inisialisasi sudah pernah dipanggil, hapus terlebih dahulu instance
	// yang sudah pernah dibuat.
	if (cn!=NULL) {		
		delete stmt;
		delete psDelete;
		delete psInsert;
		delete psSelectAll;
		delete psSelectByNIM;
		delete psUpdate;
		delete cn;
	}

	// Membuat koneksi ke database
	char strUser[100], strPassword[100], strNamaDatabase[100];
	size_t len;
	wcstombs_s(&len, strUser, user, 100);
	wcstombs_s(&len, strPassword, password, 100);
	wcstombs_s(&len, strNamaDatabase, namaDatabase, 100);

	try {

		driver = get_driver_instance();
		cn = driver->connect("tcp://127.0.0.1:3306", strUser, strPassword);
		cn->setSchema(strNamaDatabase);

		// Membuat tabel Mahasiswa bila belum dibuat
		stmt = cn->createStatement();
		stmt->execute("CREATE TABLE IF NOT EXISTS tblMahasiswa (nim CHAR(10), nama VARCHAR(200), tahunMasuk INT)");

		// Menyiapkan PreparedStatement
		psSelectAll = cn->prepareStatement("SELECT nim, nama, tahunMasuk FROM tblMahasiswa");
		psSelectByNIM = cn->prepareStatement("SELECT nim, nama, tahunMasuk FROM tblMahasiswa WHERE nim = ?");
		psUpdate = cn->prepareStatement("UPDATE tblMahasiswa SET nama = ?, tahunMasuk = ? WHERE nim = ?");
		psDelete = cn->prepareStatement("DELETE FROM tblMahasiswa WHERE nim = ?");
		psInsert = cn->prepareStatement("INSERT INTO tblMahasiswa(nim, nama, tahunMasuk) VALUES (?, ?, ?)");

		// Melakukan query seluruh data di tblMahasiswa
                this->Refresh();

	} catch (SQLException &e) {
		return E_FAIL;
	}

	return S_OK;
}

Method Inisialisasi() bertanggung jawab untuk menyiapkan koneksi database sehingga dapat dipakai oleh pemanggil method-method lainnya.

Berikutnya, lakukan modifikasi pada CMahasiswaService::SimpanMahasiswa()sehingga terlihat seperti berikut ini:

STDMETHODIMP CMahasiswaService::SimpanMahasiswa(BSTR nim, BSTR nama, int tahunMasuk)
{
	// Konversi BSTR menjadi SQLString
	char strNIM[11], strNama[201];	
	size_t len;
	wcstombs_s(&len, strNIM, nim, 10);
	wcstombs_s(&len, strNama, nama, 200);

	// Memeriksa apakah record sudah pernah tersimpan atau tidak	
	try {
		psSelectByNIM->setString(1, strNIM);
		if (psSelectByNIM->executeQuery()->next()) {

			// Record sudah tersimpan, lakukan proses update
			psUpdate->setString(1, strNama);
			psUpdate->setInt(2, tahunMasuk);
			psUpdate->setString(3, strNIM);
			psUpdate->executeUpdate();

		} else {

			// Record belum tersimpan, lakukan proses insert
			psInsert->setString(1, strNIM);
			psInsert->setString(2, strNama);
			psInsert->setInt(3, tahunMasuk);
			psInsert->executeUpdate();

		}
	} catch (SQLException &e) {
		return E_FAIL;
	}

	return S_OK;
}

Method CMahasiswa::SimpanMahasiswa() adalah sebuah method yang melakukan salah satu dari operasi insert atau update. Bila NIM yang diberikan sudah tersimpan di tabel, maka method ini akan memberikan query SQL UPDATE. Namun bila NIM yang diberikan belum pernah tersimpan, maka method ini akan memberikan query SQL INSERT. Cara seperti ini akan mempermudah user yang memakai DLL ini karena mereka hanya perlu “mempelajari” satu method. Kelemahannya adalah kinerja yang berkurang karena harus selalu melakukan SELECT untuk memeriksa apakah record sudah pernah tersimpan atau belum.

Berikutnya, lakukan modifikasi pada CMahasiswa::HapusMahasiswa()sehingga kode programnya terlihat seperti berikut ini:

STDMETHODIMP CMahasiswaService::HapusMahasiswa(BSTR nim)
{
	// Konversi BSTR menjadi SQLString
	char strNIM[11];
	size_t len;
	wcstombs_s(&len, strNIM, nim, 10);	

	// Menghapus record berdasarkan NIM
	try {

		psDelete->setString(1, strNIM);
		psDelete->executeUpdate();

	} catch (SQLException &e) {
		return E_FAIL;
	}

	return S_OK;
}

Method CMahasiswaService::HapusMahasiswa() adalah method yang sederhana, hanya menghapus data di tabel berdasarkan parameter NIM yang diberikan.

Berikutnya, cari method CMahasiswaService::CariMahasiswaByNIM()dan lakukan perubahan sehingga isinya akan terlihat seperti berikut ini:

STDMETHODIMP CMahasiswaService::CariMahasiswaByNIM(BSTR nim, IMahasiswa** ret)
{
	// Konversi BSTR menjadi SQLString
	char strNIM[11];
	size_t len;
	wcstombs_s(&len, strNIM, nim, 10);	

	try {

		ResultSet* rs;

		// Melakukan query untuk mencari record berdasarkan NIM
		psSelectByNIM->setString(1, strNIM);
		rs = psSelectByNIM->executeQuery();
		if (rs->next()) {

			// Record ditemukan.  Buat instance class Mahasiswa dan
			// inisialisasi nilai, serta kembalikan nilainya.
			CComPtr ptrMahasiswa;
			ptrMahasiswa.CoCreateInstance(CLSID_Mahasiswa);
			IMahasiswa* pMahasiswa = (IMahasiswa*) ptrMahasiswa;
			CComBSTR bstrNIM(rs->getString(1)->c_str());
			pMahasiswa->put_NIM(bstrNIM);
			CComBSTR bstrNama(rs->getString(2)->c_str());
			pMahasiswa->put_Nama(bstrNama);
			pMahasiswa->put_TahunMasuk(rs->getInt(3));						
			ptrMahasiswa.CopyTo(ret);
		}

		delete rs;

	} catch (SQLException &e) {
		return E_FAIL;
	}

	return S_OK;
}

Method CMahasiswaService::CariMahasiswaByNIM() mengembalikan pointer ke IMahasiswa. Ini berarti, di PHP nanti, kita bisa membuat kode program seperti:

<?php   
  $com = new COM("Jocki.MahasiswaService");   
  $com->Inisialisasi("root", "password", "dbLatihan");

  // Cara 1
  $mhs = $com->CariMahasiswaByNIM("1103030023");
  print "Nama [" . $mhs->Nama . "]<br>";

  // Atau, Cara 2
  print "Nama [" . $com->CariMahasiswaByNIM("1103030023")->Nama . "]<br>";
?>

Programmer PHP (selaku “konsumen“) bisa memakai hasil kembalian dari operasi pencarian berdasarkan NIM secara lebih leluasa (walaupun lebih repot bagi kamu selaku “produsen” ;). Tanpa class Mahasiswa, maka hasil kembalian dapat berupa array yang lebih tidak nyaman dipakai.

Sekarang, dari semua operasi CRUD, kamu telah mengimplementasikan Create, Update dan Delete. Langkah terakhir adalah membuat implementasi Read.  Operasi yang satu ini berbeda dengan yang lainnya, karena saat kita mengembalikan isi tabel, kita tidak hanya mengembalikan satu nilai, melainkan kumpulan nilai.  Istilah COM-nya adalah Collection.  Kamu membutuhkan sebuah class khusus untuk menampung kumpulan nilai tersebut.  Selain itu, kamu membutuhkan sebuah cara untuk mengakses Collection, yang disebut sebagai Enumerator.  Beruntungnya, ATL menyediakan class yang dapat langsung kamu pakai.  Masih ingat dengan property Item dan _NewEnum yang kamu buat sebelumnya?  Ini akan dipakai untuk Enumerator.  Kamu tidak akan membuat implementasinya secara manual karena kamu akan memakai CComEnumOnSTL dan IEnumVARIANT yang disediakan oleh ATL.

Buka file MahasiswaService.h, lalu tambahkan kode program berikut setelah baris using namespace ATL:

#include <list>
struct _CopyVariantFromAdaptItf {
 static HRESULT copy(VARIANT* p1, const CAdapt<CComPtr<IMahasiswa>>* p2) {
 HRESULT hr = p2->m_T->QueryInterface(IID_IDispatch, (void**) &p1->pdispVal);
 p1->vt = VT_DISPATCH;
 return hr;
 }
static void init(VARIANT* p) { VariantInit(p); }
 static void destroy(VARIANT* p) {VariantClear(p); }
};
typedef CComEnumOnSTL<IEnumVARIANT, &IID_IEnumVARIANT, VARIANT, _CopyVariantFromAdaptItf, std::list<CAdapt<CComPtr<IMahasiswa>>>> 
 CComEnumVariantOnMahasiswaService;
struct _CopyItfFromAdaptItf {
 static HRESULT copy(IMahasiswa** p1, const CAdapt<CComPtr<IMahasiswa>>* p2) {
 if (*p1=p2->m_T) return (*p1)->AddRef(), S_OK;
 return E_POINTER;
 }
 static void init(IMahasiswa** p) {}
 static void destroy(IMahasiswa** p) {if (*p) (*p)->Release();}
};
typedef ICollectionOnSTLImpl<
 IDispatchImpl<IMahasiswaService, &IID_IMahasiswaService>,
 std::list<CAdapt<CComPtr<IMahasiswa>>>,
 IMahasiswa*,
 _CopyItfFromAdaptItf,
 CComEnumVariantOnMahasiswaService>
 IMahasiswaServiceCollImpl;

Kemudian, cari bagian definisi class CMahasiswaService di bawahnya, dan ubah sehingga terlihat seperti berikut ini:

class ATL_NO_VTABLE CMahasiswaService :
 public CComObjectRootEx<CComSingleThreadModel>,
 public CComCoClass<CMahasiswaService, &CLSID_MahasiswaService>,
 public IMahasiswaServiceCollImpl

Berikutnya, cari method CMahasiswaService::Refresh() dan lakukan perubahan sehingga isinya akan terlihat seperti berikut ini:

STDMETHODIMP CMahasiswaService::Refresh(void)
{
try {
	ResultSet* rs;

	// Melakukan select seluruh baris di tabel
	rs = psSelectAll->executeQuery();

	while (rs->next()) {
		// Membuat pointer ke  CMahasiswa
		CComPtr ptrMahasiswa;
		ptrMahasiswa.CoCreateInstance(CLSID_Mahasiswa);
		IMahasiswa* pMahasiswa = (IMahasiswa*) ptrMahasiswa;
		CComBSTR bstrNIM(rs->getString(1)->c_str());
		CComBSTR bstrNama(rs->getString(2)->c_str());
		pMahasiswa->put_NIM(bstrNIM);
		pMahasiswa->put_Nama(bstrNama);
		pMahasiswa->put_TahunMasuk(rs->getInt(3));
		m_coll.push_back(ptrMahasiswa);
	}

	delete rs;

} catch (SQLException &e) {
	return E_FAIL;
}

return S_OK;
}

Ok, sekarang kamu telah selesai!  Pilih menu Build, Build Solution untuk membuat output DLL dari proyek kamu.

Kamu bisa membuat sebuah halaman PHP untuk menguji operasi CRUD database, misalnya dengan halaman PHP berikut ini:

<!DOCTYPE html>
<html>
<head>
 <title>Latihan COM DLL - Operasi CRUD MySQL</title>
 <style type="text/css">
 table { border-collapse: collapse; border: 1px solid black;}
 td { padding: 10px; }
 th { border-bottom: 3px double black; padding: 5px;}
 </style>
</head>
<?php
 $aksi = $_REQUEST['aksi']; 
 if ($aksi=='') $aksi='lihat';
 $myself = $_SERVER['PHP_SELF'];

 $mahasiswaService = new COM("Jocki.MahasiswaService");
 $mahasiswaService->Inisialisasi("root", "password", "namadb");
if ($aksi=='tambah') {
?> 
 <h1>Tambah Mahasiswa</h1>
 <form action="<?php print $myself;?>" method="POST">
 <fieldset>
 <p>
 <label for="txtNIM">NIM:</label>
 <input type="text" name="txtNIM" size="10" />
 </p>
 <p>
 <label for="txtNama">Nama:</label>
 <input type="text" name="txtNama" size="50"/>
 </p> 
 <p>
 <label for="txtTahunMasuk">Tahun Masuk:</label>
 <input type="text" name="txtTahunMasuk" size="5"/>
 </p>
 <input type="hidden" name="aksi" value="prosesTambah"/>
 <input type="submit" value="Tambah Mahasiswa"/> 
 </fieldset>
 </form>

<?php 
 } else if ($aksi=='prosesTambah') {
$nim = $_POST['txtNIM'];
 $nama = $_POST['txtNama'];
 $tahunMasuk = $_POST['txtTahunMasuk'];
 $mahasiswaService->SimpanMahasiswa($nim, $nama, $tahunMasuk);
 header("Location: $myself");

 } else if ($aksi=='hapus') {

 $nim = $_GET['txtNIM'];
 $mahasiswaService->HapusMahasiswa($nim); 
 header("Location: $myself");

 } else if ($aksi=='update') {

 $nim = $_GET['txtNIM'];
 $mahasiswa = $mahasiswaService->CariMahasiswaByNIM($nim);
?> 

 <h1>Update Mahasiswa</h1>
 <form action="<?php print $myself;?>" method="POST">
 <fieldset>
 <p>
 NIM: <?php print $nim; ?> 
 <input type="hidden" name="txtNIM" value="<?php print $nim; ?>" />
 </p>
 <p>
 <label for="txtNama">Nama:</label>
 <input type="text" name="txtNama" size="50" value="<?php print $mahasiswa->Nama; ?>"/>
 </p> 
 <p>
 <label for="txtTahunMasuk">Tahun Masuk:</label>
 <input type="text" name="txtTahunMasuk" size="5" value="<?php print $mahasiswa->TahunMasuk; ?>"/>
 </p>
 <input type="hidden" name="aksi" value="prosesTambah"/>
 <input type="submit" value="Update Mahasiswa"/> 
 </fieldset>
 </form>

<?php 
 } else if ($aksi=='lihat') {
?> 
 <h1>List Mahasiswa</h1>
 <table>
 <thead>
 <tr><th>NIM</th><th>Nama</th><th>Tahun Masuk</th><th>Operasi</th></tr>
 </thead>
 <tbody>
 <?php 
 foreach ($mahasiswaService as $mahasiswa) {
 $nim = $mahasiswa->NIM;
 print "<tr>" .
 "<td>" . $nim . "</td>" .
 "<td>" . $mahasiswa->Nama . "</td>" .
 "<td>" . $mahasiswa->TahunMasuk . "</td>" .
 "<td><a href='$myself?aksi=hapus&txtNIM=$nim'>Hapus</a> - " .
 "<a href='$myself?aksi=update&txtNIM=$nim'>Edit</a></td>" .
 "</tr>";
 }
 ?>
 </tbody>
 </table>
 <a href="<?php print $myself; ?>?aksi=tambah">Tambah Data Mahasiswa Baru</a>
<?php 
 } 
?>
</html>

File PHP di atas belum mencakup validasi, tetapi cukup untuk menguji apakah operasi CRUD database melalui COM DLL berfungsi dengan baik.

COM DLL Akses MySQL – Bagian 3: Operasi Database Insert

Tulisan ini merupakan bagian dari panduan membuat COM DLL (ATL) di Visual Studio 2010 yang mengakses MySQL atas request Albert Antonius:

Mari mulai dengan membuat sebuah ATL Object.  Caranya adalah dengan membuka Class View.  Bila tab Class View tidak muncul, pilih menu View, Class View.  Klik kanan pada LatihanCOM, dan pilih Add, Class… Pada dialog yang muncul, pilih ATL Simple Object kemudian klik tombol Add. Isi dialog ATL Simple Object Wizard dengan memberi nama Mahasiswa pada Short name serta Latihan.Mahasiswa pada ProgID seperti yang terlihat di gambar berikut ini:

Membuat ATL Object Baru

Membuat ATL Object Baru

Klik tombol Finish. Bila kamu masih bingung dengan langkah ini, coba baca kembali artikel pengenalan di sini.

Sekarang kita akan menambahkan property DBUser untuk menampung user name yang dipakai untuk akses database nantinya. Masih di Class View, klik kanan pada interface IMahasiswa, pilih Add, Add Property… Isi Property Type dengan BSTR dan isi Property name dengan DBUser seperti yang terlihat pada gambar berikut:

Membuat Property DBUser

Membuat Property DBUser

Klik tombol Finish.

Lakukan hal yang sama untuk menambahkan property DBPassword yang menampung password untuk akses database MySQL, seperti yang terlihat pada gambar berikut:

Membuat Property DBPassword

Membuat Property DBPassword

Klik tombol Finish.

Kembali lakukan hal yang sama untuk menambahkan property DBNama yang menampung nama database MySQL yang akan dipakai, seperti yang terlihat pada gambar berikut:

Membuat Property DBNama

Membuat Property DBNama

Klik tombol Finish.

Apa itu BSTR? Tebakanmu benar, BSTR adalah tipe data String versi COM. Ingat bahwa COM adalah teknologi yang tidak terikat oleh bahasa. Padahal, hampir setiap bahasa memiliki tipe data String tersendiri, misalnya di bahasa C memakai char*, bahasa C++ memakai class string, bahasa Java memakai class java.lang.String, dan sebagainya.

Sekarang kita akan membuat deklarasi method, yaitu method Inisialisasi. Method ini akan melakukan pemeriksaan database dan membuat tabel yang dibutuhkan. Caranya adalah dengan klik kanan pada interface IMahasiswa, pilih Add, Add Methods… Pada dialog yang muncul, isi Method name dengan Inisialisasi, seperti yang terlihat pada gambar berikut ini:

Membuat Method Inisialisasi

Membuat Method Inisialisasi

Klik tombol Finish.

Lalu buat method lain, yaitu method TambahMahasiswa. Caranya adalah dengan klik kanan pada interface IMahasiswa, lalu pilih Add, Add Method… Pada dialog yang muncul, isi Method name dengan TambahMahasiswa. Berikan tiga parameter [in] berupa BSTR nim, BSTR nama, dan int tahunMasuk seperti yang terlihat pada gambar berikut ini:

Membuat Method TambahMahasiswa

Membuat Method TambahMahasiswa

Klik tombol Finish.

Bila kamu melakukan langkah-langkah yang ada dengan benar, di file LatihanCOM.idl, kamu akan menemukan bagian berikut ini:

interface IMahasiswa : IDispatch{
	[propget, id(1)] HRESULT DBUser([out, retval] BSTR* pVal);
	[propput, id(1)] HRESULT DBUser([in] BSTR newVal);
	[propget, id(2)] HRESULT DBPassword([out, retval] BSTR* pVal);
	[propput, id(2)] HRESULT DBPassword([in] BSTR newVal);
	[propget, id(3)] HRESULT DBNama([out, retval] BSTR* pVal);
	[propput, id(3)] HRESULT DBNama([in] BSTR newVal);
	[id(4)] HRESULT TambahMahasiswa([in] BSTR nim, [in] BSTR nama, [in] int tahunMasuk);
	[id(5)] HRESULT Inisialisasi(void);
};

Seperti yang kamu ketahui, interface hanya sebuah kontrak tanpa isi. Interface adalah sebuah janji tanpi aksi. Oleh sebab itu, kamu perlu membuat implementasi dari interface IMahasiswa.

Tapi sebelumnya, masih ingat kamu membuat tiga property, yaitu DBUser, DBPassword, dan DBNama? Kamu perlu membuat tiga variabel untuk menampung masing-masing nilai tersebut. Kamu bisa mengubah definisi class secara langsung di file Mahasiswa.h, tetapi biar gampang, kamu dapat menambahkan variabel melalui wizard. Pastikan kamu masih berada di Class View. Klik kanan pada class CMahasiswa, pilih Add, Add Variable… Pada Access, plih private. Pada Variable type, ketik char[100]. Pada Variable name, isi dengan m_dbUser, sehingga dialog akan terlihat seperti:

Membuat private member variable

Membuat private member variable

Klik tombol Finish.

Lakukan hal yang sama untuk membuat variabel m_dbPassword dan m_dbNama. Kedua variabel tersebut juga sama-sama bertipe char[100]. Yup, kita membatasi hingga maksimal 100 karakter.

Setelah interface dan variabel selesai dibuat, pertanyaannya adalah dimana kamu meletakkan implementasi kode program?  Buka Solution Explorer (bila kamu tersesat, klik menu View, Solution Explorer). Kemudian double click pada file Mahasiswa.cpp. Disini adalah tempat kamu meletakkan isi dari method untuk class CMahasiswa.

Kita akan mulai dengan get/put untuk property yang ada. Ganti method yang bersangkutan sehingga isinya terlihat seperti berikut ini:

size_t len;

STDMETHODIMP CMahasiswa::get_DBUser(BSTR* pVal)
{
	CComBSTR bstr(m_dbUser);	
	*pVal = bstr.Detach();
	return S_OK;
}

STDMETHODIMP CMahasiswa::put_DBUser(BSTR newVal)
{	
	wcstombs_s(&len, m_dbUser, newVal, 99);	
	return S_OK;
}

STDMETHODIMP CMahasiswa::get_DBPassword(BSTR* pVal)
{
	CComBSTR bstr(m_dbPassword);
	*pVal = bstr.Detach();
	return S_OK;
}

STDMETHODIMP CMahasiswa::put_DBPassword(BSTR newVal)
{	
	wcstombs_s(&len, m_dbPassword, newVal, 99);
	return S_OK;
}

STDMETHODIMP CMahasiswa::get_DBNama(BSTR* pVal)
{
	CComBSTR bstr(m_dbNama);
	*pVal = bstr.Detach();
	return S_OK;
}

STDMETHODIMP CMahasiswa::put_DBNama(BSTR newVal)
{	
	wcstombs_s(&len, m_dbNama, newVal, 99);
	return S_OK;
}

Saya menambahkan sebuah deklarasi size_t len karena variabel yang sama ini akan dipakai pada saat pemanggilan fungsi wcstombs_s(). Btw, di sini saya menggunakan class CComBSTR milik framework ATL untuk melakukan konversi char* (C string) menjadi BSTR. Sebaliknya, untuk melakukan konversi BSTR menjadi char* (C string), saya menggunakan fungsi wcstombs_s().
Berikutnya, saya akan menambahkan deklarasi method Inisialisasi. Tapi karena akan memakai Connector/CPP, maka saya menambahkan baris berikut ini di bagian atas di class Mahasiswa.cpp:

#include "mysql_connection.h"
#include <cppconn\driver.h>
#include <cppconn\exception.h>
#include <cppconn\prepared_statement.h>
#include <cppconn\statement.h>

using namespace sql;

Lalu, saya mengubah method Inisialisasi sehingga terlihat seperti berikut ini:

STDMETHODIMP CMahasiswa::Inisialisasi(void)
{
	Driver* driver;
	Connection* con;
	Statement* st;

	driver = get_driver_instance();
	con = driver->connect("tcp://127.0.0.1:3306", m_dbUser, m_dbPassword);
	con->setSchema(m_dbNama);

	st = con->createStatement();
	st->execute("CREATE TABLE IF NOT EXISTS tblMahasiswa (nim CHAR(10), nama VARCHAR(200), tahunMasuk INT)");
	delete st;
	delete con;

	return S_OK;
}

Method ini akan secara otomatis membuat sebuah tabel dengan nama tblMahasiswa bila tabel tersebut belum ada. Biar cepat, saya mengandaikan bahwa server MySQL berada di komputer yang sama (IP 127.0.0.1). Saya juga mengabaikan penanganan kesalahan disini.

Sekarang, ubah method TambahMahasiswa sehingga terlihat seperti berikut ini:

STDMETHODIMP CMahasiswa::TambahMahasiswa(BSTR nim, BSTR nama, int tahunMasuk)
{
	Driver* driver;
	Connection* con;
	PreparedStatement* ps;
	char pNim[11];
	char pNama[201];
	wcstombs_s(&len, pNim, nim, 10);
	wcstombs_s(&len, pNama, nama, 200);

	driver = get_driver_instance();
	con = driver->connect("tcp://127.0.0.1:3306", m_dbUser, m_dbPassword);
	con->setSchema(m_dbNama);

	ps = con->prepareStatement("INSERT INTO tblMahasiswa(nim, nama, tahunMasuk) VALUES (?,?,?)");
	ps->setString(1, pNim);
	ps->setString(2, pNama);
	ps->setInt(3, tahunMasuk);
	ps->executeUpdate();

	delete ps;
	delete con;

	return S_OK;
}

Langkah terakhir untuk COM kita adalah membuatnya dengan memilih menu Build, Build Solution. Jika tidak ada pesan kesalahan, maka kita siap untuk lanjut ke tahap berikutnya.

Yang perlu kamu lakukan berikutnya adalah membuat sebuah database baru di MySQL Server. Kamu juga boleh memakai database yang sudah ada. Kamu dapat membuat database baru dengan menggunakan PHPMyAdmin, dan jika kamu terbiasa memakai MySQL Console, maka kamu dapat memberikan perintah:

CREATE DATABASE nama_database;
GRANT ALL ON nama_database.* to nama_user@`127.0.0.1`;

Wow.. Perjalanan yang panjang,  bukan? Tapi percayalah, dibalik sesuatu yang rumit selalu ada kesederhanaan. Kamu sudah membuat bagian rumit-nya, sekarang saatnya menikmati hasil jerih payah kamu.

Buat sebuah halaman PHP dengan seperti berikut ini:

<?php
 if (isset($_GET['txtNIM']) && isset($_GET['txtNama']) && 
 isset($_GET['txtTahunMasuk'])) {

 $com = new COM("Latihan.Mahasiswa");
 $com->DBUser = "root";
 $com->DBPassword = "password";
 $com->DBNama = "latihan";
 $com->Inisialisasi();

 $nim = $_GET['txtNIM'];
 $nama = $_GET['txtNama'];
 $tahunMasuk = $_GET['txtTahunMasuk'];
 $com->TambahMahasiswa($nim, $nama, $tahunMasuk);
}
?>
<html>
<head><title>Latihan Insert</title></head>
<body>
<form action="<?php print $_SERVER['PHP_SELF'] ?>" method="GET">
 <p>NIM: <input type="text" name="txtNIM" size="10" /></p>
 <p>Nama: <input type="text" name="txtNama" size="20" /></p>
 <p>Tahun Masuk: <input type="text" name="txtTahunMasuk" size="10" /></p>
 <p><input type="submit" value="Simpan" /></p>
</form>
</body>
</html>

Pada kode program di atas, jangan lupa menyesuaikan user, password, dan nama database.

Sekarang,  buka halaman PHP tersebut di browser, isi data pada form yang muncul dan klik tombol Simpan. Kemudian periksa isi tabel tblMahasiswa dengan menggunakan PHPMyAdmin ataupun MySQL Console. Jika kamu mengikuti langkah yang ada dengan benar, maka data yang kamu masukkan akan tersimpan ke tabel tblMahasiswa.

Kode program PHP yang mengakses database terlihat sederhana & singkat, bukan? Tapi membuat COM DLL-nya terasa penuh perjuangan, bukan? Lain kali bila kamu melihat sesuatu yang sederhana, kamu mungkin telah sadar bahwa dibaliknya pasti ada yang bekerja keras menyembunyikan kerumitannya.  Sebenarnya, banyak kerumitan bisa dihindari, misalnya bila kamu memakai ADO atau memakai DLL .NET, yang nantinya tidak beda bila memakai Java dengan Web Service (SOAP).  Tapi tidak setidaknya, kamu sudah merasakan sesuatu yang low-level (semakin low-level semakin rumit, sehingga muncullah teknologi high-level untuk menyembunyikan kerumitan dan membuat orang-orang lupa bahwa low-level sebenarnya eksis).

COM DLL Akses MySQL – Bagian 2: Membuat Project di Visual Studio 2010

Tulisan ini merupakan bagian dari panduan membuat COM DLL (ATL) di Visual Studio 2010 yang mengakses MySQL atas request Albert Antonius:

Langkah paling awal tentu saja membuka Visual Studio 2010.  Klik pada New Projects.   Kemudian di pilihan template,  cari yang namanya Visual C++, ATL.  Lalu pilih ATL Project, misalnya LatihanCOM.  Berikan nama pada project tersebut, lalu klik tombol OK.  Visual Studio 2010 akan menampilkan ATL Project Wizard.  Kita tidak perlu melakukan perubahan disini sehingga cukup klik tombol Finish.

Setelah proyek dibuat, langkah penting yang perlu kamu lakukan adalah mengubah Solution Configurations dari Debug menjadi Release seperti yang terlihat pada gambar berikut ini:

Solutions Configuration

Solutions Configuration

Jika kamu lupa melakukan langkah ini dan merubah configuration belakangan, maka kamu perlu mengulang langkah-langkah setelah ini dari awal!!

Sekarang, klik kanan pada proyek LatihanCOM, lalu pilih Properties.  Kita akan melakukan beberapa perubahan disini.

Di Configuration Properties, pilih C/C++,  General.  Kemudian klik drop-down di Additional Include Directories dan pilih <Edit…> seperti yang terlihat pada gambar berikut ini:

Mengatur Additional Include Directories

Mengatur Additional Include Directories

Akan muncul dialog Additional Include Directories.  Klik pada tombol New Line (Ctrl-Insert).  Akan muncul sebuah baris untuk mengisi lokasi direktori.  Klik tombol di kanannya  untuk mempermudah browse file seperti yang terlihat di gambar berikut ini:

Menambah Directori Include

Menambah Directori Include

Pada dialog browse yang muncul, pilih direktori include yang berada di direktori ConnectorCPP (output pada bagian 1), kemudian klik Select Folder.

Lakukan hal yang sama kembali.  Klik tombol New Line (Ctrl-Insert), kali ini pilih direktori include yang berada di lokasi instalasi MySQL.  Misalnya, jika MySQL kamu ada di C:\xampp\mysql, maka folder ini adalah C:\xampp\mysql\include.

Kembali lakukan hal yang sama.  Klik tombol New Line (Ctrl-Insert), dan pilih direktori yang berisi Boost (lihat bagian 1).

Jika kamu melakukannya dengan benar, dialog-mu akan terlihat seperti ini (direktori ini mungkin bisa berbeda tergantung pada drive dan nama yang kamu pakai):

Include Directories

Include Directories

Klik tombol OK.

Sebenarnya apa fungsi direktori tersebut?  Kalau kamu lihat, direktori tersebut berisi file header (diakhiri dengan *.h).  Kecuali untuk boost_1_50_0, di dalam subfolder boost terdapat file hpp (precompiled header).  Semua file ini dipakai dengan cara #include.  Kamu masih ingat bukan dengan #include <iostream> atau #include <stdio.h> di pelajaran C++ ?  Yup, benar… iostream.h dan stdio.h adalah file header yang sudah ada di Visual C++.  Tapi file header yang akan kamu pakai adalah file header yang tidak berada pada lokasi direktori standard.  Itu sebabnya kamu perlu memberitahu Visual C++ untuk mencari ke direktori mana, seandainya kamu memberikan #include “mysql_connection.h”.

Sekarang kita akan beralih ke Preprocessor (masih di bawah C/C++).   Pada baris pertama terdapat Preprocessor Definitions.  Kita perlu menambahkan sebuah definisi baru karena kita akan memakai static library (ini adalah persyaratan dari Connector/C++ bukan dari Visual C++).  Klik tombol drop-down di bagian kanan, kemudian klik pada <Edit…>.  Tambahan definisi CPPCONN_PUBLIC_FUNC= sehingga dialog yang muncul akan terlihat seperti pada gambar:

Preprocessor Definitions

Preprocessor Definitions

Klik tombol OK.

Berikutnya, cari bagian Precompiled Headers.  Pada bagian Precompiled Header, ganti menjadi Not Using Precompiled Headers.  Ini adalah rekomendasi dari Boost, karena kita tidak akan memakai  precompiled header yang kita buat sendiri.

Ok, pengaturan untuk compiler C++ sudah selesai.  Sekarang kita akan melakukan pengaturan pada linker.

Buka Linker, General, kemudian cari bagian Per-user Redirection.  Ganti menjadi Yes, sehingga registry yang seharusnya ditulis ke HKEY_CLASSES_ROOT akan ditulis ke HKEY_CURRENT_USER.  Kenapa begitu?  Karena jika kamu menjalankan Visual Studio 2010 sebagai user biasa, maka kamu tidak akan punya akses untuk menulis ke HKEY_CLASSES_ROOT.

Sekarang kita beralih ke bawahnya, ke bagian Linker, General, Additional Library Directories.  Yang ini hampir mirip seperti di Addition Include Directories.  Klik pada drop-down, kemudian pilih <Edit…>.  

Pada dialog Additional Library Directories yang muncul, klik pada tombol New Line (Ctrl-Insert), kemudian browse ke folder lib yang ada di ConnectorCPP (output pada bagian 1).

Lakukan hal yang sama kembali.  Klik pada tombol New Line (Ctrl-Insert), tapi kali ini browse ke folder lib yang terletak di lokasi instalasi MySQL kamu.

Jika kamu melakukannya dengan benar, dialog-mu akan terlihat seperti pada gambar berikut ini:

Additional Library Directories

Additional Library Directories

Sebenarnya buat apa melakukan pengaturan Additional Library Directories?  Karena kamu memakai library tambahan yang bukan bawaan dari Visual C++.  Dan kamu perlu memberitahu pada Visual C++ dimana harus mencari library tambahan yang kamu pakai.

Ok, jadi apa nama library yang kamu pakai?  Kamu belum memberitahukannya pada Visual C++.  Jadi, pilih Linker, Input, kemudian klik pada drop-down di Additional Dependencies.  Kemudian klik pada <Edit…>.  Akan muncul sebuah dialog.  Tambahkan mysqlcppconn-static.lib dan libmysql.lib seperti yang terlihat di gambar berikut ini:

Additional Dependencies

Additional Dependencies

Klik tombol OK.

Kamu tentu masih ingat dengan mysqlcppconn-static.lib yang kamu hasilkan di bagian 1 dari artikel ini.  Ini adalah sebuah static library.  Pada jenis library ini, kode program library akan digabungkan ke dalam DLL  hasil akhir-mu nanti.  Hal ini menyebabkan ukuran DLL-mu bertambah besar, tetapi lebih cepat.  Kebalikan dari static library adalah dynamic library.  Ingat file mysqlcppconn.dll yang juga kamu hasilkan?  Ini adalah dynamic library.  Bila kamu memakai dynamic library, kamu harus memastikan file dll ini selalu ada di sistem pengguna.  Keuntungannya dibanding static library adalah ukuran program lebih kecil karena kode program library tidak digabungkan dengan DLL kamu melainkan ada di file DLL lain yang terpisah.

Pada artikel ini, kamu akan memakai static library sehingga kamu mengisi mysqlcppconn-static.lib.

Lalu apa itu libmysql.lib?  Ini adalah library Connector/C.  Yup, Connector/C++ dibangun berdasarkan Connector/C sehingga tetap dibutuhkan library versi bahasa C.  Anggap saja Connector/C++ memakai Connector/C tetapi dengan menyediakan sebuah lapisan abstraksi tersendiri yang OOP dan lebih mudah dipakai sehingga pengguna tidak perlu memanggil Connector/C secara langsung.  Kamu bisa meng-install Connector/C secara terpisah, tetapi beruntungnya, library C ini  sudah ter-install bersama dengan MySQL Server.

Klik tombol OK untuk menutup dialog properties.  Setelah pengaturan proyek selesai, kita siap untuk membuat kode program.

COM DLL Akses MySQL – Bagian 1: Membuat Library

Tulisan ini merupakan bagian dari panduan membuat COM DLL (ATL) di Visual Studio 2010 yang mengakses MySQL atas request Albert Antonius:

Library yang saya build dengan Visual Studio 2010 dan MySQL 5.5.9 dapat ditemukan di https://docs.google.com/open?id=0B-_rVDnaVRCbQVlfbmktcDZXOEE.  Kamu boleh melewati bagian ini dan memakai library yang saya build atau yang disediakan di situs MySQL, tetapi library yang ada belum tentu cocok untuk sistem kamu.

Langkah pertama sebelum kamu mulai membuat kode program adalah mencari library untuk mengakses MySQL di Windows.  Kenapa?  Karena Visual C++ secara bawaan tidak menyediakan API untuk memanggil MySQL.  Kalau kamu mau, kamu bisa menggunakan ADO.  Tapi di artikel ini, kamu akan menggunakan API yang lebih cepat yaitu MySQL Connector/C++.  Pada saat tulisan ini dibuat, versi terakhir yang tersedia adalah versi 1.1.

Buka halaman http://dev.mysql.com/downloads/connector/cpp/ untuk download library yang dibutuhkan.  Tunggu… “Mana yang harus saya pilih?” demikian kamu bertanya padaku.  Sebaiknya kamu download mysql-connector-c++-1.1.0.zip.  Setelah kamu extract, kamu akan menemukan kode program dan header, yang TIDAK bisa langsung kamu pakai!!

“Apa?  Menyuruh saya men-download sesuatu yang tidak bisa langsung saya pakai?” kamu pasti keberatan, “Saya sibuk dan saya perlu cara instan!!!”  Jika kamu berpikir demikian, maka kamu perlu ingat kembali bahwa kita berada di dunia C++, sebuah dunia yang sangat terikat pada platform.  Kamu pasti sudah sering mendengar cerita tentang Java yang multi platform,  kamu bahkan sudah merasakan bagaimana memakai library hanya dengan menambahkan file JAR,  dan kamu akan jarang sekali perlu menghasilkan JAR ini secara manual dari source code.  Tapi Java tidak bisa segalanya, dan kadang-kadang kita butuh C++ yang  TIDAK multi platform.  Sedikit perbedaan versi sistem operasi dan perbedaan versi compiler bisa membuat sebuah library C++ menjadi usang dan penuh pesan kesalahan.  Oleh sebab itu, lebih baik kita menghasilkan library dari source code sehingga kita bisa yakin library tersebut cocok dengan sistem kita.   Pada halaman download terdapat peringatan seperti ini “One problem that can occur is when the tools you use to build your application are not compatible with the tools used to build the binary versions of MySQL Connector/C++. Ideally, you need to build your application with the same tools that were used to build the MySQL Connector/C++ binaries.

Ok, setelah download source Connector/C++, kamu perlu men-download CMake di http://cmake.org/cmake/resources/software.html.  Pastikan kamu men-download installer cmake-2.8.8-win32-x86.exe. “Apa lagi itu?” tanyamu.  Mungkin kamu akan menemukan banyak hal baru yang tidak ada di kuliah C++, tapi jika kamu suka petualangan, kamu akan menemukan banyak yang menarik.  CMake adalah sebuah tools untuk kompilasi proyek dan aktifitas serupa, mirip seperti make di Linux atau nmake.exe di Visual Studio.  Perbedaannya adalah CMake tersedia di banyak platform.  “Dengan CMake, source code jadi multi platform seperti di Java?” tanyamu.  Tidak, bukan!  Bukan source code-nya, tapi tool untuk kompilasi-nya.  Dengan CMake, kamu ga perlu ganti ke Linux hanya gara2 proyek  memakai make.

Pastikan pada saat kamu meng-install CMake, kamu memilih “Add CMake to the system PATH” (terserah, ke all users atau current user).  Hal ini akan mempermudah kamu dalam memberikan perintah di command prompt nanti tanpa harus memusingkan direktori instalasi CMake.  Walaupun ada versi GUI dengan nama cmake-gui, kamu akan memakai versi command prompt, bukan agar terlihat keren, tetapi untuk mempermudah copy paste dari artikel ini.

Sekarang buka kembali folder mysql-connector-c++-1.1.0 yang telah di-extract.  Disini kamu akan menjumpai sebuah file dengan nama CMakeLists.txt.  Yup, sesuai dengan tebakanmu, ini adalah file yang akan dikerjakan oleh CMake.

Mari jalankan CMake.  Mulai dengan buka sebuah command prompt di Windows 7.  Kemudian pindah ke direktori mysql-connector-c++-1.1.0.  Sebagai contoh, jika direktori tersebut berada di Desktop, maka saya mengetikkan perintah:

CD C:\Users\Jocki\Desktop\mysql-connector-c++-1.1.0

Berikutnya, kamu perlu memberitahu dimana kamu meng-install MySQL. Kamu pasti tahu bukan? Jika kamu memakai XAMPP, kemungkinan besar MySQL ada di C:\xampp\mysql.  Berikan perintah berikut ini:

SET MYSQL_DIR=C:\xampp\mysql

Langkah berikutnya, karena Connector/C++ memakai Boost, maka kamu perlu men-download Boost di http://www.boost.org/users/download/.   Apa itu Boost?  Boost adalah kumpulan library untuk C++ yang sangat lengkap mulai dari fitur foreach hingga dukungan akses jaringan yang portable.  Kamu bisa melihat fitur lengkapnya di http://www.boost.org/doc/libs/1_50_0/.  Jika kamu memakai Boost di ujian mata kuliah C++, mungkin dosenmu akan terkagum-kagum dan memberimu nilai A++ (oops.. A++ adalah A=A+1, nilainya B donk?!)

Setelah download Boost, extract source-nya ke sebuah folder.  Jika folder tersebut adalah C:\Users\Jocki\Desktop\boost_1_50_0, maka berikan perintah seperti berikut ini:

SET BOOST_ROOT=C:\Users\Jocki\Desktop\boost_1_50_0

Sekarang, kamu siap akan melakukan kompilasi kode program yang ada, dengan memberikan perintah:

cmake -G "Visual Studio 10" -DCMAKE_INSTALL_PREFIX=C:\Users\Jocki\Desktop\ConnectorCPP

Pada perintah di atas, kamu akan menggunakan Visual Studio 2010.  Kamu juga memberitahu bahwa nantinya, hasil output yang paling final akan ada di folder C:\Users\Jocki\Desktop\ConnectorCPP.  Kamu mungkin perlu menyesuaikan lokasi ini sesuai selera.

Setelah CMake selesai bekerja, akan ada tulisan Configuring done, Generating done, serta Build files have been written to.

Bila kamu melihat lokasi extract source Connector/C++, kamu akan menemukan file baru, seperti MYSQLCPPCONN.sln, ALL_BUILD.vcxproj, INSTALL.vcxproj, PACKAGE.vcxproj, dan ZERO_CHECK.vcxproj.  Sekarang kamu telah memiliki file-file yang dapat langsung dibuka di Visual Studio 2010.

Double klik file MYSQLCPPCONN.sln.  Visual Studio 2010 akan diluncurkan.  Ini adalah sebuah Solution yang terdiri atas 35 projects!!  Sebelum kamu mulai melakukan sesuatu, ganti Solutions Configuration dari Debug menjadi Release, seperti yang terlihat pada gambar berikut ini:

Solutions Configuration

Solutions Configuration

Klik kanan pada nama proyek ALL_BUILD, kemudian pilih menu BUILD.  Visual C++ akan melakukan proses compile & linking setiap source code yang ada.  Bila kamu terbiasa mem-program proyek open source C++, maka kamu tidak akan terkejut dengan prosesnya yang memakan waktu.  Tapi bila ini pertama kalinya, kamu masih sempat ke dapur untuk membuat kopi.  “Gila.. Kode program C++ paling panjang yang pernah gw temui selama kuliah sekali klik masih bisa langsung muncul hasilnya.. Pertama kalinya gw mesti nunggu lama untuk jalanin program,” mungkin kamu berpikir demikian, tapi hidup memang rumit dan harus berlanjut!  Ngomong-ngomong ini baru build connector-nya, kamu masih belum build MySQL dari kode program (yup, MySQL dibuat pakai C++, tapi kamu biasanya download installer-nya yang sudah ‘jadi’).

Setelah proses build selesai,  klik kanan pada proyek bernama INSTALL.   Lalu pilih Build.  Proses kali ini tidak lama karena pada dasarnya hanya men-copy file hasil linking ke folder yang telah ditentukan.

Bila kamu melakukannya dengan benar, akan terbentuk sebuah folder ConnectorCPP di Desktop (btw, lokasi ini kamu yang tentukan!). Di dalamnya ada folder include dan lib.  Di dalam folder lib terdapat file mysqlcppconn.dll, mysqlcppconn.lib, dan mysqlcppconn-static.lib.  Ini adalah library yang kamu butuhkan.  Dan karena kamu membuatnya dari nol, maka library ini pasti kompatibel dengan sistem-mu.