C# Stored Procedures vs Linq

Dalam dot net programming, banyak cara bagi developer untuk melakukan hubungan dengan database dan mengaksesnya. Secara umum ada 2 cara yang umum digunakan yaitu menggunakan DataSet+SqlDataAdapter atau Linq.

Secara garis besar, kita dapat menggambarkan keuntungan Linq dibanding data adapter:
  • object oriented, sehingga tipe data yang diakses sudah terkonversi menjadi data type dot net. Hal ini membuat penggunaan tipe data yang lebih aman
  • Linq memiliki query optimizer sendiri sehingga query dasar yang digunakan developer sudah diimprove secara otomatis
  • relasi table dapat dilakukan secara obect-oriented sehingga lebih mudah digunakan saat development
Namun di samping itu Linq memiliki kelemahan yang cukup signifikan. Berikut adalah keunggulan stored procedure dibanding dengan Linq:
  • struktur objek Linq sangat bergantung pada struktur database, sehingga perubahan sekecil apapun akan memerlukan penangan dari sisi applikasi atau applikasi berpotensi break. Sementara mengubah stored procedures tidak memerlukan perubahaan dari sisi applikasi.
  • sulit untuk menelusuri query-query yang digunakan (terutama yang kompleks). Tujuan dari penelusuran tersebut seperti saat debugging atau indexing
  • stored procedures dapat digunakan untuk query yang simple hingga yang query kompleks seperti summarize atau pagination

C# Winforms vs WPF

Banyak sekali modul-modul applikasi yang dapat dibangun dan dipergunakan dengan menggunakan .Net C# Winforms. Winforms sendiri juga sudah merupakan framework yang bagus, sudah full-oop, event-driven dan stable. Namun mengapa Windows memutuskan untuk mengeluarkan framework yang lain, yaitu WPF, sebagai framework desktop lain di samping winforms? Berikut adalah perbedaan antara WPF dan Winforms.
  • Winforms sangat mendukung architecture pattern MVC (model-view-controller), sementara WPF lebih mendukung menggunakan architecture pattern MVVM (model-view-viewmodel)
  • Dalam arsitekturnya, Winforms adalah event-driven sementara WPF lebih mendukung binding
  • Component (control) dalam WPF lebih customizable dibanding Winforms
  • Struktur penulisan WPF adalah hampir sama dengan Silverlight, modul mirip flash yang dapat di-run dari browser
  • Winforms menggunakan Windows API dalam men-render UI sementara WPF menggunakan directX sehingga lebih lightweight (less resource)
  • Konstruksi UI winforms seluruhnya menggunakan codebehind, sementara WPF menggunakan XAML (walaupun dapat juga dilakukan dari codebehind)
  • Pada WPF terdapat control "Style", yang dapat di-reuseable sehingga user tidak perlu membuat usercontrol sendiri untuk me-style kan controlnya. 
Kesimpulannya, WPF lebih mendukung data binding, style-customizable dan lightweight UI render. Namun apabila user baru mempelajari programming, lebih disarankan untuk dimulai dengan Winforms, karena lebih mudah dipelajari daripada WPF.

C# Public Property vs Public Attribute

Well, setelah cukup lama bermain dengan C#, ada beberapa hal yang terkesan 'lucu' dalam pembelajaran. Hal tersebut adalah property vs attribute.
Dalam mendeklarasi class di C#, ada beberapa cara untuk merepresentasikan attribut, di antaranya adalah:
  • Public attribute, yaitu dengan mendeklarasi attribute dengan access modifier public, sehingga mudah dapat digunakan oleh class lain
  • Property, yaitu mendeklarasi public attribute dengan accessor get; dan/atau set;
  • Function getter setter, cara ini digunakan umum oleh java
Sekilas, public attribute dan property tidak banyak berbeda, terkecuali get/set accessor yang dapat di-inject oleh potongan syntax. Namun ternyata setelah banyak menggunakan dua hal ini, ada perbedaan yang cukup jelas, yaitu public attribute tidak akan tampil untuk data yang di-binding, baik itu WPF binding, winform binding ataupun Asp.Net binding. Karenanya, biasakan untuk menggunakan property dan bukan public attribute.

Try / Catch, The Double-edged Sword

Try/catch, untuk mayoritas programmer (terutama java) pasti tidak asing lagi dengan syntax tersebut. Syntax tersebut memiliki kemampuan yang hebat dan sangat membantu dalam melakukan pengembangan.

Namun, penggunaan try/catch yang tidak hati-hati dan sembarangan dapat membuat celah dalam sistem. Salah satu celah yang paling umum adalah tidak adanya error message (isi catch kosong). Celah tersebut membuat debugging menjadi susah karena exception tidak menghasilkan error box.

Jadi, apa saja yang harus diperhatikan dalam penggunaan try/catch? Berikut adalah beberapa hal yang sepengalaman saya harus diperhatikan:

1. Penanganan Exception dalam catch.
Object Exception memiliki property Message yang membawa pesan error yang terjadi. Salah satu penanganan exception yang paling mudah adalah menggunakan MessageBox (desktop app) atau Response.Write (asp). Penanganan lebih 'advanced' dapat berupa refresh data, kalkulasi autonomous, dan lainnya sesuai dengan tujuan.

2. Object Exception memiliki turunan
Object Exception memiliki turunan sesuai dengan error yang ada. Misalnya seperti FormatException pada .Net yang dihasilkan dari penggunaan format yang berbeda (misalnya ada karakter ketika parsing ke int, umumnya terjadi ketika parse). Ada juga NullReferenceException dimana program berusaha mendapatkan dan memproses variable yang bernilai null. Penanganan yang berbeda untuk tiap-tiap jenis Exception yang berbeda dapat membantu mempercepat development.

3. Pastikan tidak ada proses bersangkutan yang berjalan setelah ada Exception. Ingat, proses tetap berjalan setelah try/catch.
Misalkan anda memiliki int angka yang didapat dari parsing tbox1.Text. Anda men-'trap' proses parsing tersebut ke dalam try/catch. Kemudian angka tersebut akan digunakan untuk memasukkan data ke dalam database. Proses input data tersebut akan tetap berjalan walaupun ada Exception tanpa penanganan.

Proses yang salah:

int angka=0;
try{
  angka = int.Parse(tbox1.Text);
}
catch(Exception e){
  //show message here
}
//insert process, nilai angka adalah 0


Salah satu cara untuk menghindarinya:

int angka=0;
try{
  angka = int.Parse(tbox1.Text);
  //insert process
}
catch(Exception e){
  //show message here
}

CUtility.Forms.CTextBoxCurrency

Digunakan untuk menggantikan TextBox asal .Net yang digunakan untuk menangani input currency. Merupakan extended dari CTextBoxNominal.

cTextBoxCurrency.CurrencyPre
Menentukan string yang akan digunakan sebagai mata uang, ditampilkan sebelum text.

cTextBoxCurrency.CurrencyPost
Menentukan string yang akan digunakan sebagai mata uang, ditampilkan setelah text.

CTextBoxCurrency cTextBoxCurrency = new CTextBoxCurrency();
cTextBoxCurrency.CurrencyPre = "Rp. "; // hasilnya Rp. 0
cTextBoxCurrency.CurrencyPre = "";
cTextBoxCurrency.CurrencyPost = " US$"; // hasilnya 0 US$


Keyword: (C# custom textbox, C# textbox currency, C# textbox uang)

CUtility.Forms.CTextBox

Digunakan untuk menggantikan TextBox asal .Net dengan kustomisasi lebih banyak dan mudah.

cTextBox.InputMode
Menentukan karakter apa saja yang dapat diinput oleh user. Terdiri dari alpha, numeric, specialchar dan space. Dapat dikombinasikan dengan keyword '|' .
CTextBox cTextBox = new CTextBox();
cTextBox.InputMode = InputMode.Alpha | InputMode.Numeric | InputMode.Space;


cTextBox.AllowedSpecialChar
Menentukan karakter apa saja di luar [a-zA-Z][0-9] dan spasi yang dapat diinput.
CTextBox cTextBox = new CTextBox();
cTextBox.InputMode = InputMode.SpecialChar;
cTextBox.AllowedSpecialChar = "[],.\\/\":;" ; 

CUtility.Forms.CTextBoxNominal

Digunakan untuk pengganti TextBox bawaan .Net. Dikhususkan untuk menampung data nominal (angka).

cTextBoxNominal.AllowDecimal
Menentukan apakah boleh memasukkan nilai decimal (dengan karakter titik)

cTextBox.Nominal.AllowMinus
Menentukan apakah boleh memasukkan inputan minus (dengan karakter -)

cTextBoxNominal.TextToInt
Mengambil isi textbox yang telah diparse ke int. Jangan pergunakan ini untuk AllowDecimal = true. Fungsinya sama dengan int.Parse(cTextBoxNominal.Text).

cTextBoxNominal.TextToFloat
Mengambil isi textbox yang telah diparse ke float. Fungsinya sama dengan float.Parse(cTextBoxNominal.Text).

cTextBoxNominal.TextToDouble
Mengambil isi textbox yang telah diparse ke double. Fungsinya sama dengan double.Parse(cTextBoxNominal.Text).

Contoh:

CTextBoxNominal cTextBoxNominal = new CTextBoxNominal;
cTextBoxNominal.AllowDecimal = false;
cTextBoxNominal.AllowMinus = true;
int angka = cTextBoxNominal.TextToInt;

cTextBoxNominal.AllowDecimal = true;
float angka = cTextBoxNominal.TextToFloat;
double angka = cTextBoxNOminal.TextToDouble;


CUtility ver 1.0.1.1

Release kedua dari CUtility dengan beberapa perubahan:

CUtility ver 1.0.1.1 dapat diperoleh di sini.

CUtility.Print.Automated

Pengembangan dari CUtility.Print, dan digunakan untuk melakukan fungsi print yang lebih baik. Keunggulan CUtility.Print.Automated dibanding CUtility.Print adalah:

  • Modular Support - fungsi print dapat dipisah-pisah menjadi bagian-bagian untuk mempermudah modifikasi
  • Precalculated Height - fungsi print menghitung terlebih dulu tinggi dari objek yang akan dicetak, dan secara otomatis memindahkan ke halaman baru apabila dibutuhkan
  • Groupable - perintah-perintah cetak dapat dikelompokkan secara hirarki untuk mempermudah modifikasi dan mendukung fungsi modular lebih lanjut
Contoh penggunaan CUtility.Print.Automated dapat didownload di sini.

Keyword: (C# print, C# print document, C# print table, C# print auto new page)

CUtility.Print

Digunakan untuk menghasilkan tampilan cetakan yang lebih baik. Dilengkapi dengan fungsi-fungsi yang praktis dan mudah digunakan seperti Write, WriteLine, WriteCenter, DrawHorizontalLine, dsb.
Keunggulan dari CUtility.Print adalah:

  • Memiliki fungsi-fungsi cetak yang mudah digunakan dan umum, seperti Write, WriteLine, WriteCenter
  • Memiliki track cursor position sehingga pengaturan kursor cetak lebih mudah
  • Mengingat font, brush dan pen yang digunakan dalam mencetak
  • Mendukung pencetakan table

Contoh hasil menggunakan CUtility.Print:



Fungsi-fungsi CUtility.Print dikembangkan lebih jauh ke dalam namespace CUtility.Print.Automated.

Keyword: (C# print, C# print document, C# print table, C# print utility)

CUtility.Forms.CToolTip

Digunakan untuk menampilkan ToolTip dengan kustomisasi yang lebih dari ToolTip bawaan .Net.

cToolTip.Panel
Set panel yang akan digunakan untuk tampilan.
cToolTip.Panel = new Panel(); // mengeset tampilan tooltip seperti new panel biasa cToolTip.Panel = this.panelInfo; // mengeset tampilan tooltip sesuai dengan panelInfo yang ada dalam class

cToolTip.SetToolTip(Control control, string caption)
Mengeset Control yang akan mendapatkan ToolTip.
cToolTip.SetToolTip(label1, "A"); // mengeset object label1 agar mendapat tooltip. String yang dimasukkan tidak boleh kosong, namun tidak berpengaruh apa-apa.

CUtility.IOUtil

Digunakan untuk beberapa keperluan seperti path pada filename.

CUtility.IOUtil.RelativeFilePath(string filename)
Digunakan untuk mendapatkan path relatif dari filename (tidak memiliki label drive, dll). Berdasarkan pada application domain.

IOUtil.RelativeFilePath("C:\data\word.doc"); //return word.doc

CUtility.IOUtil.AbsoluteFilePath(string filename, string location)
Digunakan untuk mendapatkan path absolut dari filename berdasarkan pada application domain.

IOUtil.AbsoluteFilePath("word.doc", "data"); //return C:\application\data\word.doc

CUtility.IOUtil.MD5Hash(string word)
Digunakan untuk mendapatkan enkripsi md5.

IOUtil.MD5Hash("Hello World"); //return encrypted "Hello World" word

CUtility.IOUtil.IsDesignMode()
Digunakan untuk mengetahui design mode / running mode.

CUtility.IOUtil.IsDesignMode(); //return true if in design mode

CUtility.IOUtil.MeasureString(string text, Font font)
Digunakan sebagai static function untuk menggantikan Graphics.MeasureString.


CUtility.IOUtil.MeasureString("A", new Font("Times new roman", 12)); //return size dari A

CUtility.Validator

Digunakan untuk mengecek isi karakter atau angka.

CUtility.Validator.IsNum
Digunakan untuk mengecek apakah karakter atau string hanya berisi angka.

CUtility.Validator.IsNum("123456"); //return true
CUtility.Validator.IsNum("A123456"); //return false


CUtility.Validator.IsAlpha
Digunakan untuk mengecek apakah karakter atau string hanya berisi karakter alfabet.

CUtility.Validator.IsAplha("ABCabc"); //return true
CUtility.Validator.IsAlpha("ABC1"); //return false


CUtility.Validator.IsAlNum
Digunakan untuk mengecek apakah karakter atau string hanya berisi karakter alfabet atau angka.

CUtility.Validator.IsAlNum("ABC123"); //return true
CUtility.Validator.IsAlNum("ABC123,."); //return false


CUtility Documentation

Daftar-daftar dari dokumentasi CUtility:

CUtility.Validator: http://serlock-works.blogspot.com/2012/02/cutilityvalidator.html
CUtility.IOUtil: http://serlock-works.blogspot.com/2012/02/cutilityioutil.html

CUtility.Forms Namespace
CUtility.Forms.CToolTip: http://serlock-works.blogspot.com/2012/02/cutilityformsctooltip.html
CUtility.Forms.CTextBox: http://serlock-works.blogspot.com/2012/03/cutilityformsctextbox.html
CUtility.Forms.CTextBoxNominal: http://serlock-works.blogspot.com/2012/03/cutilityformsctextboxnominal.html
CUtility.Forms.CTextBoxCurrency: http://serlock-works.blogspot.com/2012/03/cutilityformsctextboxcurrency.html

CUtility, Custom Component for C#

Sepertinya sudah setahun sejak pertama kali mengembangkan CUtility ini. Akhirnya diputuskan untuk dipublikasikan agar lebih banyak programmer yang dapat menggunakannya.

CUtility adalah custom library yang didesain untuk .Net, dibuat dengan bahasa C#. Isi dari CUtility sendiri bermacam-macam, mulai dari control UI yang dimodifikasi sendiri agar lebih mudah dan menarik, config-config yang lebih mudah digunakan dan semacamnya.
CUtility juga dilengkapi dengan CUtility.Print yang mendukung print dengan .Net Framework. CUtility.Print mendukung pencetakan table, pencetakan secara modular, pencetakan dengan metode-metode umum, dsb.
CUtility ver. 1.0.1.1. dapat didownload di sini.

Older version:
CUtility ver. 1.0.0. dapat didownload di sini.