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).

Perihal Solid Snake
I'm nothing...

8 Responses to COM DLL Akses MySQL – Bagian 3: Operasi Database Insert

  1. Ping-balik: COM DLL Akses MySQL – Bagian 1: Membuat Library « The Solid Snake

  2. Ping-balik: COM DLL Akses MySQL – Bagian 2: Membuat Project di Visual Studio 2010 « The Solid Snake

  3. Ping-balik: COM DLL Akses MySQL – Bagian 4: Membuat Operasi CRUD Untuk Tabel Mahasiswa « The Solid Snake

  4. Ping-balik: COM DLL Akses MySQL – Bagian 5: Implementasi Kode Program « The Solid Snake

  5. jhal prob mengatakan:

    mantap gan artikelnya lengkap,,,
    library ini mungkin layaknya SOAP y gan, yang beberapa tahun lalu hanya bisa di bikin DLLnya melalui VBcode,,, tetapi saat saya mencobanya dengan Visual Studio 2005 kenapa muncul error seperti ini yah gan:

    1>.\mahasiswa.cpp(27) : error C2660: ‘wcstombs_s’ : function does not take 4 arguments
    1>.\mahasiswa.cpp(43) : error C2660: ‘wcstombs_s’ : function does not take 4 arguments
    1>.\mahasiswa.cpp(60) : error C2660: ‘wcstombs_s’ : function does not take 4 arguments
    1>.\mahasiswa.cpp(73) : error C2664: ‘sql::Connection *sql::Driver::connect(const sql::SQLString &,const sql::SQLString &,const sql::SQLString &)’ : cannot convert parameter 2 from ‘char’ to ‘const sql::SQLString &’
    1> Reason: cannot convert from ‘char’ to ‘const sql::SQLString’
    1> No constructor could take the source type, or constructor overload resolution was ambiguous
    1>.\mahasiswa.cpp(74) : error C2664: ‘sql::Connection::setSchema’ : cannot convert parameter 1 from ‘char’ to ‘const sql::SQLString &’
    1> Reason: cannot convert from ‘char’ to ‘const sql::SQLString’
    1> No constructor could take the source type, or constructor overload resolution was ambiguous
    1>.\mahasiswa.cpp(96) : error C2664: ‘sql::Connection *sql::Driver::connect(const sql::SQLString &,const sql::SQLString &,const sql::SQLString &)’ : cannot convert parameter 2 from ‘char’ to ‘const sql::SQLString &’
    1> Reason: cannot convert from ‘char’ to ‘const sql::SQLString’
    1> No constructor could take the source type, or constructor overload resolution was ambiguous
    1>.\mahasiswa.cpp(97) : error C2664: ‘sql::Connection::setSchema’ : cannot convert parameter 1 from ‘char’ to ‘const sql::SQLString &’
    1> Reason: cannot convert from ‘char’ to ‘const sql::SQLString’
    1> No constructor could take the source type, or constructor overload resolution was ambiguous
    1>Build log was saved at “file://d:\jenny\OfficeProj\My_Apps\My_Apps\Release\BuildLog.htm”
    1>My_Apps – 7 error(s), 0 warning(s)
    2>—— Skipped Build: Project: My_AppsPS, Configuration: Release Win32 ——
    2>Project not selected to build for this solution configuration

    mohon pencerahannya dunk gan
    thx

    • jhal prob mengatakan:

      saya mengubah code:
      [qoute]
      wcstombs_s(&len, m_dbUser, newVal, 99);
      [/qoute]
      menjadi :
      [qoute]
      wcstombs_s(&len, &m_dbUser, (size_t)BUFFER_SIZE, newVal, (size_t)BUFFER_SIZE);
      [/qoute]
      error wcstombs_s sudah hilang, tapi apakah nanti ini tidak akan menjadi masalah
      dan sekarang tinggal error pada bagian sql

  6. Solid Snake mengatakan:

    Kesalahan yang kamu alami kemungkinan besar disebabkan karena mendefinisikan m_dbUser, m_dbPassword atau m_dbNama bukan sebagai array seperti char m_dbUser[100] melainkan sebuah char tunggal seperti char m_dbUser.

    Kode program SQLString dari Connector CPP akan melakukan operator overloading yang dapat menerjemahkan char menjadi SQLString. Bila m_dbUser didefinisikan sebagai array dari char, maka ia adalah pointer ke char (sebuah char) sehingga secara otomatis akan diterjemahkan menjadi SQLString.

    Namun, kamu memperoleh kesalahan cannot convert from ‘char’ to ‘const sql::SQLString’. Ini menunjukkan kalau yang akan dikonversi adalah sebuah char tunggal bukan char* seperti yang diharapkan.

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: