Generic Data Access

Standard

ADO.NET menyediakan beberapa namespace berbeda untuk pengaksesan
database. Seperti yang telah saya jelaskan di Pengenalan ADO.NET
setiap mengubah database kita harus mengubah juga namespacenya
misal untuk MS Access : System.Data.OleDb, SQL Server :
System.Data.SqlClient. Celakanya, bukan hanya namespace yang
diubah, class class didalam namespace tersebut juga harus berubah

Contoh :

OleDbConnection menjadi SqlConnection
OleDbCommand menjadi SqlCommand
OleDbDataReader menjadi SqlDataReader

Dari sudut pandang software engineering, jika ingin membuat aplikasi
yang scalable dan dinamis, kita harus memikirkan desain arsitektur
yang “tahan banting”.

Perubahan adalah salah satu hal yang tidakbisa dihindari dalam
software development,  karenanya kita harus mempertimbangkan berbagai
aspek yang kemungkinan bisa terjadi dikemudian hari. Karena fokus
kita kali ini di basis data saya hanya akan fokus bagaimana cara mensiasati
jika dikemudian hari terjadi pergantian DBMS karena alasan tertentu.

Salah satu solusi untuk mengatasi perubahan DBMS adalah dengan
membuat generic data access agar program tidak tergantung dengan
database tertentu.Sehingga jika terjadi pergantian, tidak akan
ada perubahan signifikan yang mungkin menyebabkan terjadinya
ripple effect.

.NET Framework menyediakan namespace System.Data.Common untuk
pembuatan generic data access. Namespace tersebut memiliki
class-class berikut

DBProviderFactory = Pembuatan instance provider data source spesifik
DBConnection = Membuka koneksi
DBCommand = Eksekusi perintah SQL
DBDataReader = Menampilkan data
DBDataAdapter = Penghubung ke DataSet

dan masih banyak lagi, saya hanya akan membahas class-class utama
saja dalam namespace tersebut.

class utama dalam namespace tersebut adalah DBProviderFactory.
Class ini bertanggung jawab terhadap pembuatan instance dari provider
data source yang diinginkan.

Contoh :

MS Access

string driver="System.Data.OleDb";
string connStr="Provider=Microsoft.Jet.OleDb.4.0;Data Source=c:\NWIND.mdb";

DbProviderFactory factory = DbProviderFactories.GetFactory(driver);
DbConnection conn = factory.CreateConnection();
conn.ConnectionString = connStr;
conn.Open();

Data source pada contoh diatas menggunakan MS Access, sehingga
namespace yang digunakan adalah System.Data.OleDb dan Connection
string nya untuk MS Access jika ingin menggantinya ke SQL Server
maka yang perlu diubah cukup driver dan connection string nya.

SQL Server

string driver="System.Data.SqlClient";
string connStr="Data Source=DOSEN\SQLEXPRESS;Initial Catalog=NWIND;Integrated Security=True";

DbProviderFactory factory = DbProviderFactories.GetFactory(driver);
DbConnection conn = factory.CreateConnection();
conn.ConnectionSring = connStr;
conn.Open();

Yang menarik disini driver, dan connStr diperlakukan sebagai string,
sehingga informasi ini bisa kita simpan dalam bentuk konfigurasi di XML.
Dengan demikian jika terjadi perubahanimplentasi database program
tidak usah di compile ulang, cukup dengan mengubah konfigurasi
XML nya.

Bayangkan sebuah aplikasi client-server skala enterprise
yang client nya bisa jadi terdiri dari banyak sekali komputer, compile
ulang dan mendistribusikan kembali program tersebut ke client.

Hmmm….ini mimpi buruk bagi system administrator 🙂

Jika kita simpan dalam bentuk XML, file konfigurasi ini bisa disimpan
diserver. Jika terjadi perubahan cukup mengedit file XML tersebut 1 kali,
dan client tidak usah disentuh sama sekaliTentu saja program tadi perlu
dimodifkasi sedikit jika file XML nyaterletak diserver.

Anda bisa baca topik socket programming di .NET.

Berikut ini akan saya contohkan operasi INSERT,UPDATE,DELETE
dan SELECT

INSERT


DBCommand cmd;

cmd = conn.CreateCommand();
cmd.Connection = conn;
cmd.CommandText = "INSERT INTO Customers (CustomerID,CompanyName) VALUES (@CustId,@Name)";
cmd.ExecuteNonQuery();

cmd.Parameters["@CustId"].Value ="XRS";
cmd.Parameters["@Name"].Value = "XERIS;

cmd.ExecuteNonQuery();
cmd.Dispose();

UPDATE

cmd = conn.CreateCommand();
cmd.Connection = conn;
cmd.CommandText = "UPDATE Customers SET CompanyName=@Name WHERE CustomerID=@CustId";

cmd.Parameters["@CustId"].Value = "XRS";
cmd.Parameters["@Name"].Value = "XERIS System Interface";

cmd.ExecuteNonQuery();
cmd.Dispose();

DELETE

cmd = conn.CreateCommand();
cmd.Connection = conn;
cmd.CommandText = "DELETE FROM Customers WHERE CustomerID=@CustId";
cmd.Parameters["@CustId"].Value = "XRS";

cmd.ExecuteNonQuery();
cmd.Dispose();

SELECT

cmd = conn.CreateCommand();
cmd.Connection = conn;
cmd.CommandText = "SELECT * FROM " + table + " WHERE CompanyName LIKE @Name";
cmd.Parameters["@Name"].Value = "'%" + name + "%'";

rdr = cmd.ExecuteReader();

while (rdr.Read())
{
 Console.WriteLine(rdr["CustomerID"]);
 Console.Writeline(rdr["CompanyName"]);
}

rdr.Close();
cmd.Dispose();

Lalu bagaimana kalau konfigurasi data source nya diletakkan di XML?
.NET Framework menyediakan akses ke konfigurasi XML lewat namespace
System.Configuration. Class yang digunakan adalah ConfigurationManager

perhatikan contoh berikut :

string driver=ConfigurationManager.AppSettings["Driver"];
string connStr=ConfigurationManager.AppSettings["ConnectionString"];

Sedangkan konfigurasi XML disimpan di file App.config<?xml version=”1.0″ encoding=”utf-8″ ?>
<configuration>
<appSettings>
<add key=”Driver” value=”System.Data.OleDb”/>
<add key=”ConnectionString” value=”Provider=Microsoft.Jet.OleDb.4.0;Data Source=c:\NWIND.mdb”/>
</appSettings>
</configuration>

3 thoughts on “Generic Data Access

  1. IMHO solusi untuk bikin sistem yang “tahan banting” seperti definisi di atas, gak cukup dengan generic data access. Ini akan cukup, jika perintah SQL yang digunakan adalah perintah-perintah yang memenuhi standar ANSI SQL. Sedangkan masalah lain timbul jika SQL yang digunakan tidak sesuai standar ANSI.

    Contoh begini, di MS SQL Server, untuk mengambil nilai bulan dari suatu tanggal, digunakan fungsi MONTH(field_tanggal), sedangkan di Postgresql, biasanya digunakan to_char(field_tanggal,’mm’)::int.

    Itu baru contoh yang sangat kecil. Masih banyak permasalahan lain yang sering terjadi.

    Sebetulnya, jika ingin dibuat yang betul-betul “tahan banting”, cara yang paling tepat adalah dengan menggunakan ORM seperti Origami 🙂 Bukan begitu bapak Ari ? Heheh

Leave a comment