Selasa, 03 Januari 2012

ADO.NET Lanjut (Generic Data Access)

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 jika menggunakan database MS Access , maka namespace yang digunakkan adalah System.Data.OleDb, dan SQL Server : System.Data.OracleClient.

Celakanya, bukan hanya namespace yang diubah, class class didalam namespace tersebut juga harus berubah.
Contoh :
                OleDbConnection  ========> SqlConnection
                OleDbCommand   ========> SqlCommand
                OleDbDataReader ========> OleDbDataReader

Lalu dimanakah permasalahnnya?bukankah masing-masing class di namespace tersebut memiliki cara akses yang sama. 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 tidak bisa dihindari dalam Software Development karenanya kita harus mempertimbangkan berbagai aspek yang kemungkinan bisa terjadi dikemudian hari. Karena fokus kita kali ini di database, saya hanya akan membahas 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 DBMS tidak akan ada perubahan signifikan.

.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)
Saya hanya akan membahas class-class utama saja dalam namespace tersebut. Class utama dalam namespace tersebut adalah DBProviderFactory.Class ini bertanggungjawab 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= SYSTEMINTERFACE\\SQLEXPRESS;"
                          + "Initial Catalog=NWIND;Integrated Security=True";
DbProviderFactory factory = DbProviderFactories.GetFactory(driver);
DbConnection conn = factory.CreateConnection();
conn.ConnectionString = 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 perubahan implentasi 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..jujur saja saya tidak akan mau melakukan ini !. 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 sekali

INSERT



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

DbParameter param1 = cmd.CreateParameter();
param1.ParameterName ="@CustId";
param1.Value="XERIS";

DbParameter param2 = cmd.CreateParameter();
param2.ParameterName ="@Name";
param2.Value="XERIS System Interface";

cmd.Parameters.Add(param1);
cmd.Parameters.Add(param2);

cmd.ExecuteNonQuery();

UPDATE



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

DbParameter param1 = cmd.CreateParameter();
param1.ParameterName = "@CustId";
param1.Value = "XERIS";

DbParameter param2 = cmd.CreateParameter();
param2.ParameterName = "@Name";
param2.Value = "XERIS System Interface";

cmd.Parameters.Add(param1);
cmd.Parameters.Add(param2);

cmd.ExecuteNonQuery();

DELETE


DbCommand cmd = conn.CreateCommand();
cmd.Connection = conn;
cmd.CommandText = "DELETE FROM Customers WHERE CustomerID=@CustId";

DbParameter param1 = cmd.CreateParameter();
param1.ParameterName = "@CustId";
param1.Value = "XERIS";

cmd.Parameters.Add(param1);
cmd.ExecuteNonQuery();

 SELECT

DbCommand cmd = conn.CreateCommand();
cmd.Connection = conn;
cmd.CommandText = "SELECT * FROM Customers WHERE CompanyName LIKE @Name";

DbParameter param1 = cmd.CreateParameter();
param1.ParameterName = "@CustId";

param1.Value = "XERIS";
cmd.Parameters.Add(param1);
IDataReader rdr = cmd.ExecuteReader();

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

 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.SqlClient"/>
<add key="ConnectionString" value="Data Source=SYSTEMINTERFACE\\SQLEXPRESS;"
+ "Initial Catalog=NWIND;Integrated Security=True"/>
</appSettings>
</configuration>

 Agar dapat menakses konfigurasi XML di App.config tambahkanlah library System.configuration menggunakan IDE Microsoft Visual C# 2005 Express Edition Anda melalui menu Project->Add Reference.

1 komentar:

  1. maaf mengganggu saya hanya ingin berbagi artikel yang berkaitan tentang XML DBMS
    berikut linknya :
    http://repository.gunadarma.ac.id/bitstream/123456789/2856/1/%28ISLP-04%29.pdf
    semoga bermanfaat :)

    BalasHapus