VB.Net
VB.Net
Sejak Visual Basic 1.0 muncul pada tahun 1991, Visual Basic tumbuh sangat pesat dan menjadi bahasa pemrograman yang paling popular di dunia. Namun popularitas tidak menjamin bahwa Visual Basic mendapat pengakuan dari semua programmer. Ada yang menganggap VB sebagai bahasa sebagai bahasa pemrograman untuk mainan, dan tidak digunakan untuk membuat aplikasi yang serius seperti pada C++ atau Java. VB dianggap tidak memiliki fitur yang digunakan untuk mengembangkan aplikasi bertaraf enterprise. Ada beberapa alasan yang melatarbelakangi salah satunya yaitu VB dianggap tidak mempunyai fitur OOP (Object Oriented Programming) yang lengkap. Pada tahun 2001 Microsoft memperkenalkan teknologi .NET Framework, dan Visual Basic adalah salah satu bahasa yang disupport oleh .NET Framework. Microsoft memberi nama baru yaitu VB.NET. Dengan dukungan platform .NET, VB.NET menjadi bahasa pemrograman yang modern, powerfull, dan mendukung OOP secara lengkap. Sekarang VB.NET dapat disejajarkan dengan bahasa modern lainnya seperti C# atau Java. Meskipun VB.NET sudah ada selama kurang lebih 9 tahun (sejak .NET 1.0), tapi banyak developer VB6 yang masih belum berpindah untuk menggunakan .NET. Sebagian programmer tidak percaya dengan teknoogi yang baru, yang lain mungkin terlalu sibuk dan tidak ada waktu untuk belajar teknologi baru atau takut dengan model baru yang sangat berbeda dengan teknologi sebelumnya. Sekarang versi VB.NET yang terbaru adalah VB9 (VB 2008). Buku ini akan mengajak anda developer VB6 untuk melihat fitur-fitur terbaru dari VB9 dan kelebihan VB.NET dibandingkan dengan VB6 sehingga dapat dijadikan referensi 2
jika anda memutuskan untuk migrasi aplikasi anda ke VB.NET. Selain untuk VB6 developer, buku ini juga dapat dijadikan referensi oleh programmer lain yang ingin belajar bahasa pemrograman VB.NET dan mempelajari fitur-fitur baru dari VB9.
Erick Kurniawan
Erick lahir di Jogjakarta pada tanggal 2 Maret 1981. Penulis menyelesaikan pendidikan S1 jurusan Teknik Informatika di Universitas Kristen Duta Wacana pada tahun 2004, kemudian melanjutkan pendidikan S2 di jurusan Ilmu Komputer Universitas Gajah Mada dan selesai pada tahun 2006. Dari tahun 2004 sampai sekarang penulis bekerja sebagai dosen Prodi Sistem Informasi di Universitas Kristen Duta Wacana Jogjakarta. Selain mengajar, menulis buku dan menjadi pengembang software, penulis juga aktif sebagai pembicara seminar, kuliah umum dan memberikan training terutama yang berkaitan dengan Teknologi Microsoft. Saat ini penulis aktif di beberapa kegiatan komunitas diantaranya MUGI (Microsoft User Group) dan INDC (Indonesia .NET Developer Community). Penulis juga tercatat sebagai pengurus komunitas MUGI Jogjakarta. Pada bulan July 2009 penulis mendapatkan award Microsoft MVP (Most Valuable Professional) untuk bidang keahlian Visual Basic (https://mvp.support.microsoft.com/profile/erick). Untuk menghubungi penulis anda dapat mengirimkan email ke [email protected] Anda dapat mengunjungi blog penulis di: http://mugi.or.id/blogs/erick http://geeks.netindonesia.net/blogs/erickkurniawan
Rully Yulian MF
Rully lahir di Cianjur pada tanggal 5 Juli 1976. Penulis menyelesaikan pendidikan S1 jurusan Teknik Geofisika di Institut Teknologi Bandung pada tahun 2002. Pada tahun 2003 penulis memulai pekerjaannya sebagai programmer di sebuah konsultan IT di Bandung. Tidak lama berselang beberapa bulan kemudian penulis berpindah tempat kerja masih sebagai programmer pada sebuah perusahaan konsultan IT yang berlokasi di kota Bandung. Pekerjaan tetap terakhir penulis yaitu sebagai IT Trainer pada sebuah IT Training Center yang masih berlokasi di kota Bandung. Dari pertengahan tahun 2008 sampai sekarang penulis bekerja sebagai freelance IT Trainer di beberapa training center, kampus-kampus dan perusahaan-perusahaan khusus untuk materi yang berkaitan dengan teknologi Microsoft terutama materi .NET programming dan Microsoft RDBMS. Selain mengajar, penulis juga menjadi pengembang software untuk project yang sifatnya lepas, aktif sebagai pembicara seminar, dan kuliah umum yang berkaitan dengan teknologi dan sertifikasi Microsoft. Saat ini penulis aktif di beberapa kegiatan komunitas baik itu online maupun offline di MUGI (Microsoft User Group) dan INDC (Indonesia .NET Developer Community). Penulis juga tercatat sebagai pengurus komunitas MUGI Bandung sebagai wakil ketua. Sertifikasi yang telah penulis dapatkan yaitu MCAD.NET, MCTS, dan MCPD untuk bidang Microsoft .NET programming. 5
Sedangkan sertifikasi di bidang IT Trainer yaitu MCT (Microsoft Certified Trainer). Pada bulan Januari 2009 penulis mendapatkan award Microsoft MVP (Most Valuable Professional) untuk bidang keahlian Visual Basic (https://mvp.support.microsoft.com/profile/Rully). Untuk menghubungi penulis anda dapat mengirimkan email ke [email protected] Anda dapat mengunjungi beberapa blog penulis yang berisi tentang kegiatan penulis dan artikel-artikel yang berhubungan dengan teknologi Microsoft di : http://yulianmf.com http://geeks.netindonesia.net/blogs/yulian http://mugi.or.id/blogs/rully
Daftar Isi
PENGANTAR..............................................................................................................2 BAB 1 MIGRASI KE .NET FRAMEWORK ......................................................8 BAB 2 VISUAL STUDIO IDE .............................................................................. 17 BAB 3 DASAR VB 2008 ......................................................................................... 30 BAB 4 WINDOWS FORM.................................................................................... 76 BAB 5 OBJECT ORIENTED PROGRAMMING ........................................ 101 BAB 6 OBJEK ORIENTED PROGRAMMING BAGIAN 2 ..................... 123 BAB 7 COLLECTION ......................................................................................... 144 BAB 8 PENANGANAN KESALAHAN........................................................... 151 BAB 9 ADO .NET .................................................................................................. 165 BAB 10 CRYSTAL REPORTS .......................................................................... 277 BAB 11 .NET ASSEMBLIES.............................................................................. 321 BAB 12 FITUR BARU VB9 ................................................................................ 348 BAB 13 LINQ TO SQL......................................................................................... 379 BAB 14 LINQ TO XML ....................................................................................... 404 BAB 15 VB 6.0 TO VB.NET MIGRATION TOOLS HELPER ................ 432 BAB 16 SETUP DAN DEPLOYMENT ........................................................... 462
macam platform seperti Web, Mobile, XML Web Service, Class Library bahkan untuk Game dengan XNA. VB.NET juga dapat berintegrasi dengan bahasa lain yang berjalan diatas .NET Framework seperti C# dan C++. Tiga perbedaan mendasar pada VB6 dan VB.NET yaitu: Integrated Development Environment (IDE). Perubahan Sintaks dan Object Model dari Class. Perubahan Kompilasi kode dan menjalankan program.
VB.NET masih menggunakan Visual Studio sebagai IDE, namun sudah berbeda dengan Visual Studio yang digunakan pada VB6, sekarang Visual Studio hanyamenssuport tiga bahasa utama yaitu VB, C#, dan C++. Perbedaan yang kedua terletak pada perbedaan sintaks, karena VB.NET sudah didesign ulang menjadi lebih modern maka banyak sintaks yang dikurangi dan ditambahkan, misal perintah GoSub sudah dihilangkan tapi banyak keyword baru terutama untuk Object Oriented Programming seperti Inherits, Interface, dll. Perbedaan yang ketiga terletak pada proses untuk kompilasi dan menjalankan program. VB.NET application akan dikompilasi menjadi kode assembly tidak seperti kebanyakn aplikasi Win32. .NET juga memiliki komponen Garbage Collection yang akan secara otomatis membersihkan object yang anda buat dari memory ketika sudah tidak diperlukan. Jadi anda tidak perlu menghapus object secara manual. Setelah melihat banyak perbedaan yang ada antara VB6 dan VB.NET, pertanyaanya apakah developer VB6 harus pindah ke VB.NET? dan apa alasannya? Microsoft sendiri membuat VB.NET karena beberapa alasan, diantaranya keterbatasan VB6 untuk memenuhi kebutuhan aplikasi saat ini. Sekarang banyak kebutuhan aplikasi yang berbasis web sedangkan VB6 sangat minim dukungan terhadap pembuatan aplikasi web, anda dapt membuat ActiveX control dengan VB6, namun pengguna harus mendownload ActiveX tersebut sebelum dapat menjalankannya di web. Arsitektur ini tidak bagus karena kita mengharapkan client yang benar-benar 9
thin (hanya cukup browser tanpa perlu install program tambahan). Pengguna menginginkan kode yang dijalankan di server, mereka juga menginginkan jaminan keamanan yang baik, dan scalabilitas dari aplikasi yang dibuat. Itu semua tidak bisa dilakukan oleh VB6. Berdasarkan beberapa alasan tersebut Microsoft merasa perlu untuk membuat architecture yang lebih baik dan modern. Programmer juga menginginkan fitur-fitur Object Oriented Programming (OOP) seperti inheritance dan polymorphsm untuk membuat komponen yang lebih bagus dan menangani masalah versioning control pada komponen atau dikenal dengan istilah DLL hell. Untuk memberikan solusi atas berbagai masalah diatas Microsoft mencoba membuat kesatuan framework untuk pengembangan aplikasi yang diberi nama .NET Framework.
Kemudian tipe varian yang dapat menampung tipe apa saja yang dapat mengurangi performa program. Membuat Lebih Modern Pada VB.NET tipe Long menjadi 64bit, dan Integer menjadi 32bit. Keyword Type pada VB6 diganti menjadi Structure.
Fitur Baru
VB.NET mempunyai beberapa fitu baru yang membuat bahasa VB menjadi lebih powerfull sehingga dapat mematahkan mitos bahwa VB hanya bahasa mainan (toy language) bila dibandingkan dengan bahasa lain seperti C++ dan Java. Fitur-fitur tersebut antara lain: Dukungan Object Oriented Programming : VB.NET adalah bahasa pemrograman yang full Object Oriented. Jadi VB.NET mendukung fitur-fitur OOP seperti Inheritance, Interface, Method Overloading, Polymorphism yang akan dibahas lebih lanjut pada bab-bab selanjutnya. Structure Exception Handling : untuk menggantikan perintah OnError Goto pada VB6, VB.NET meyediakan Try..Catch..Finally error handling. Error handling pada VB.NET ini lebih mudah digunakan karena anda hanya cukup menaruh kode yang akan dicek dikalang Try, dan menyiapkan exception handling nya di kalang 11
catch. Topik tentang error handling juga akan dibahas pada bab selanjutnya dari buku ini. .NET Framework : VB.NET mempunyai koleksi class library yang sangat banyak dan terorganisasi dengan baik sehingga mudah digunakan dan dicari. Dengan menggunakan class library ini programmer tidak perlu membuat kode sendiri dari awal. GDI+: GDI+ adalah library Graphic yang digunakan untuk mengembangkan aplikasi windows form. Web Services dan Web Form : dengan VB.NET anda dapat membuat aplikasi berbasis web dengan menggunakan Web Form (ASP.NET). anda juga dapat membuat aplikasi web service untuk membuat three tier application. Cross-Languege Interoperability : karena setiap program yang berjalan di .NET dicompile menjadi assembly maka anda dapat membuat aplikasi dengan bahasa pemrograman yang berbeda yang berjalan diatas platform .NET seperti C# dan C++. Jadi anda juga dapat menggunakan komponen yang dibuat menggunakan C# atau C++ untuk digunakan di VB. Multihreading : secara default aplikasi VB.NET adalah sible thread tapi anda dapat mengimplementasikan multi thread. Fitur ini sangat berguna jika anda mempunyai aplikasi yang proses komputasinya memakan waktu lama. Type Safe Collection : fitur ini mulai ada di .NET 2.0 (VB8 atau VB 2005). Dengan fitur ini anda dapat membuat object collection yang type safe. Penjelasan lebih jauh mengenai collection akan dibahas pada bab selanjutnya. LINQ : Fitur ini mulai ada pada .NET 3.5 (VB9 atau VB 2008). LINQ (Language Integrated Query) adalah fitur baru untuk mengquery data yang ditambahkan kedalam bahasa VB dan C# sehingga kedua bahasa tersebut dapat melakukan query ke object, database, 12
xml, dan sumber data lainnya. Lebih detail mengenai LINQ akan dibahas di bab selanjutnya. XML Literal : Fitur ini mulai ada pada VB9, fitur ini adalah fitur special dari VB9 karena bahasa lain seperti C# tidak mendukung fitur ini. XML Literal akan sangat membantu anda dalam bekerja dengan XML, pada VB9 XML menjadi first class citizen yang berarti anda dapat menuliskan XML secara literal seperti anda menuliskan string. Fitur ini juga akan dibahas pada buku ini di bab selanjutnya.
VB.NET tidak mensupport pointer jadi anda tidak dapat menggunakannya lagi (pada VB6 anda dapat menggunakan fungsi StrPtr() dan ObjPtr() untuk mengakses pointer). Perintah Goto dan GoSub sudah tidak disupport di VB.NET. Cara drawing pada Form juga berubah, jika anda menggunakan custom drawing di VB6 anda harus menulis ulang kembali kodenya.
.NET Framework
Untuk bekerja di lingkungan .NET Framework maka anda harus mengetahui arsitektur dan komponen apa saja yang ada didalamnya. .NET Framewok mendukung beberapa bahasa pemrograman, adapun bahasa pemrograman yang disupport secara resmi oleh Microsoft adalah C# (CSharp), VB, dan C++, tetapi sekarang banyak bahasa lain yang juga dikembangkan untuk mensupport platform .NET diantaranya Delphi, Phyton (IronPhyton), dll. Untuk mengembangkan aplikasi berbasis .NET sebenarnya dapat digunakan lebih dari satu bahasa pemrograman (Language Interoperability) misal sebagian program menggunakan C# dan sebagian lagi menggunakan VB, tetapi disarankan untuk memilih hanya satu bahasa pemrograman saja agar aplikasi yang dibuat lebih mudah untuk di-maintain. Bahasa paling banyak digunakan di platform .NET saat ini adalah C# dan VB.
.NET Framework CLR FCL Gambar 1.1 .NET Framework
14
.NET Framework sebenarnya terdiri dari dua komponen utama yaitu CLR (Common Language Runtime) dan FCL (Framework Class Library).
Common Language Runtime (CLR) adalah pondasi utama dari Framework .NET. CLR merupakan komponen yang bertanggung jawab terhadap berbagai macam hal, seperti bertanggung jawab untuk melakukan managemen memory, melakukan eksekusi kode, melakukan verifikasi terhadap keamanan kode, menentukan hak akses dari kode, melakukan kompilasi kode, dan berbagai layanan system lainnya. Dengan adanya fungsi CLR ini, maka aplikasi berbasis .NET biasa juga disebut dengan managed code, sedangkan aplikasi di luar itu biasa disebut dengan un-managed code. Dengan adanya CLR maka tugas pengembang program menjadi lebih ringan karena 15
banyak tugas yang dahulu harus dikerjakan oleh pengembang sudah digantikan secara otomatis oleh komponen CLR ini. CLR akan melakukan kompilasi kode-kode aplikasi kita menjadi bahasa assembly MSIL (Microsoft Intermediate Language). Proses kompilasi ini sendiri dilakukan oleh komponen yang bernama Just In Time (JIT).
WPF, WCF
Drawing (GDI+)
Other Classes
.NET Framework Class Library atau sering juga disebut Base Case Library (BCL) adalah koleksi dari reusable types yang sangat banyak dan terintegrasi secara melekat dengan CLR. Kumpulan Class Library ini sangat berguna untuk pengembangan aplikasi karena developer tidak perlu membuat semuanya dari awal karena sudah disediakan oleh .NET, misal class untuk membuat aplikasi berbasis windows, class untuk membuat objek-objek koleksi, class untuk koneksi dengan database (ADO.NET), class untuk mengembangkan aplikasi berbasis web, class WPF (Windows Presentation Foundation), dan masih banyak lagi. 16
Penambahan Fitur Intellisense Code Snnipets Import dan Export Setting (Visual Studio Theme)
Halaman Awal
Pertama kali Visual Studio dijalankan, anda diharuskan untuk memilih salah satu dari beberapa setting yang disediakan.
Karena anda akan menggunakan Visual Basic maka pilih Visual Basic Development Setting. Setting ini disesuaikan dengan kebiasaan programmer VB6 di Visual Studio Classic. Tampilan Visual Studio 2008 pertama kali ketika anda menjalankannya.
18
Bagian yang paling penting dari halaman awal ini adalah Recent Project. Yang berisi list dari aplikasi yang anda gunakan terakhir kali. Jika komputer anda terkoneksi dengan internet maka anda juga dapat mengakses informasi artikel-artikel terbaru dari official website Visual Studio, jadi sebenarnya Visual Studio juga mempunyai integrated browser untuk menampilkan artikel-artikel.
19
Anda dapat melakukan konfigurasi seting At statup yang akan menentukan action yang dilakukan oleh Visual Studio ketika pertama kali dijalankan nilai defaultnya adalah Show statup page namun anda juga dapat memilih Show New Project dialog box jika ingin ketika Visual Studio dijalankan langsung menampilkan menu New Project. Yang kedua anda juga dapat mengganti url dari news channel yang akan ditampilkan. Terakhir anda juga dapat menentukan setiap berapa menit Visual Studio akan merefresh content untuk mengambil informasi terbaru dari website.
20
Solution Explorer
Jika anda sudah membuat project baru maka disebelah kanan atas Visual Studio terdapat jendela Solution Explorer. Solution Explorer adalah pengganti dari Project Explorer pada VB6. Solution Explorer berisi daftar semua file yang kita gunakan untuk membuat aplikasi. Solution Explorer dapat mengandung lebih dari satu peoject (sama dengan project group di VB6). Pada VB tidak semua file dalam solution explorer ditampilkan, ada beberapa yang disembunyikan misalnya file yang menyimpan kode design form dan reference file. Untuk menampilkan semua file yang ada klik pada tab Show All Files.
21
Toolbox
Toolbox berisi control-control yang dapat anda gunakan untuk mendesign antar muka grafis. Pada Visual Studio 2008 pengorganisasian control lebih rapi dan teratur sehingga lebih mudah untuk menemukan control yang anda inginkan.
Jika anda menginstall komponen dari vendor pihak ketiga seperti Telerik atau DevExpress maka anda dapat menambahkan komponen tersebut pada toolbox dengan cara klik kanan pada toolbox pilih Choose Items kemudian pilih komponen yang diinginkan, maka otomatis komponen tersebut akan ditambahkan kedalam toolbox. 22
Properties Window
Tampilan properties windows masih sama dengan yang ada di VB6 dari segi letak dan fungsinya. Properties window digunakan untuk memberi nilai pada properti control yang anda gunakan dalam aplikasi. Tambahan fitur pada properties window terletak pada kemampuan untuk menampilkan kategori tersembunyai menggunakan collapsible panel dengan melakukan klik pada tanda (+) dan minus (-).
Tampilan Kode
23
Tampilan kode di VB9 mempunyai banyak fitur baru yang tidak ada di VB6. Auto-formatter : anda tidak perlu khawatir tidak rapi dalam menulis kode, karena Visual Studio akan secara otomatis merapikannya untuk anda. Misal Visual Studio mengatur indentasi dari kode yang kita ketikan, merubah keyword menjadi letter case secara otomatis, dll. Fitur yang paling menarik adalah collapsible display sehingga anda dapat menyembunyikan kode yang mempunyai banyak baris agar pembacaan lebih mudah.
Anda juga dapat menambahkan keyword #Region untuk membuat region yang digunakan untuk mengelompokan kodekode anda sehingga lebih mudah untuk diatur. Region juga dapat di atur collapsible displaynya menjadi hide atau show.
#Region "My Interface" Interface IStorable Sub Read() Sub Write(ByVal obj As Object) Property Status() As String End Interface #End Region
24
Task List
Task List digunakan untuk membantu anda mengatur programming task. Untuk menampilkan task list pilih menu View Other Window Task List. Untuk menambahkan task baru kedalam task list klik icon Create Task.
Jika task sudah selesai dikerjakan anda dapat menambahkan check di sebelah kiri task. Fitur yang paling menarik pada Task List adalah anda dapat menambahkan task dengan cara menuliskan task diawali dengan keyword TODO pada kode anda, maka secara otomatis task tersebut akan ditambahkan kedalam task list. Anda juga dapat menambahkan keyword sendiri selain TODO agar komentar tersebut dapat ditambahkan dalam task list, anda juga dapat memberi prioritas pada task tersebut (low, high, atau normal). Caranya klik pada menu Tools Options pastikan check Show All Setting terpilih kemudian pilih Task List. 25
26
Code Snippet
Secagai programmer anda pasti sering mnuliskan kode yang sama untuk , misal menggunakan statement For Each, membaca file, membuat property pada class, dll. VB9 menyediakan fitur untuk menuliskan rutinitas kode tersebut secara lebih singkat disebut dengan snippet. Visual Studio sudah menyediakan snippet library yang berisi kode-kode yang sering digunakan. Anda dapat menampilkan library tersebut dengan cara klik Tools kemudian pilih Code Snippet Manager. Anda dapat memilih snippet yang ingin digunakan berdasarkan kategori yang ada.
Setiap snippet mempunyai description yang menjelaskan kegunaan dari kode snippet tersebut dan mempunyai shortcut untuk menggunakannya pada program. Misal jika anda ingin menuliskan perintah Do Until Loop pada program ada cukup menuliskan DoUntil (snippet shortcut) kemudian diikuti dengan menekan tab.
Anda cukup mengganti di bagian kotak yang berwarna biru dengan kondisi yang anda inginkan. Contoh pada gambar diatas adalah contoh snippet yang digunakan untuk print pada Crystal Report. 27
Anda dapat menambahkan snippet baru selain yang disediakan oleh Visual Studio. Caranya anda dapat menekan tombol Search Online pada Code Snippet Manager. Jika anda tertarik anda juga dapat membuat code snippet template sendiri dengan cara mendownload snippet editor di http://msdn.microsoft.com/vbasic/downloads/tools/snippete ditor.
Project Properties
Project properties adalah control panel khusus yang disediakan untuk menkonfigurasi project. Untuk masuk ke tampilan Project Properties klik kanan pada project pilih Properties maka jendela Project properties akan terbuka. Ada beberapa tab pada project properties yaitu: Application : anda dapat mengganti nama file berekstensi .exe yang akan dihasilkan oleh aplikasi anda. Compile : digunakan untuk mengatur kompiler VB, seperti opetion strict, option explicit, dan option infer. Debug : berisi command line argument, mengatur startup directory, dan mengatur setting yang berpengaruh pada debbuging session. References : berisi daftar referensi yang digunakan oleh aplikasi anda. Resources : berisi daftat resources berupa binary file seperti image, audio yang digunakan pada aplikasi anda. Settings : digunakan untuk mengatur application setting yang akan tersimpan di file configuration (app.config), misal untuk koneksi ke database. Signing : untuk memberikan strongly typed name ke project anda, agar dapat ditambahkan di GAC (Global Assembly Cache).
28
Security: untuk pengaturan security setting pada click once (tool untuk deployment aplikasi). Publish : digunakan untuk mempublikasikan aplikasi anda menggunakan ClickOnce, jadi aplikasi anda dapat diinstall di web atau jaringan lokal.
29
modern dan lengkap yang dapat digunakan mengembangkan aplikasi bertaraf enterprise.
untuk
My Object
Mulai VB8 diperkenalkan object baru dengan nama My Object yang digunakan sebagai shortcut untuk mengakses fitur-fitur yang paling sering digunakan.
Array
Array pada VB9 berbeda dengan VB6, Pada VB9 untuk menyesuaikan dengan .NET CLR (Common Language Runtime) dan alasan konsistensi maka index array harus dimulai pada elemen ke-0. Pada VB9 array juga beruba object bukan stucture.
Perubahan Sintaks
Untuk menyesuaikan dengan CLR maka team VB dari Microsoft memutuskan untuk merevisi hampir beberapa sintaks yang ada, diantaranya new assgiment shortcut, function, dan optional parameter.
Method Overloading
Pada VB9 anda dapat melakukan overloading pada method (sub atau function), jadi anda dapat membuat method dengan nama yang sama hanya jumlah atau tipe parameternya berbeda.
Delegates
Delegates adalah variable yang mereferensi ke function atau subroutine. Anda dapat menggunakan variable ini untuk mengeksekusi subroutine atau function kapan saja anda butuhkan. 31
LINQ
LINQ kepanjangan dari Language Integrated Query adalah fitur baru pada C# dan VB yang diperkenalkan pada .NET versi 3.5. LINQ mempunyai query expression seperti from, where, select yg biasa ditemui pada bahasa SQL. Dengan menggunakan LINQ, anda dapat melakukan query ke berbagai macam data seperti ke database SQL Server (LINQ to SQL), ke object DataSet (LINQ to DataSet), ke entity (LINQ to Entity Framework), data XML (LINQ to XML) dan masih banyak lagi.
Namespace
Setiap kode yang kita tulis ada didalam objek konseptual yang bernama namespace. Namespaces menjaga .NET kode dari kebingungan akibat nama class yang sama. Misal perusahaan asuransi dengan nama Act menggunakan namespace ActInsurance untuk semua program, didalam ActInsurance juga terdapat namespace dengan nama Policy, jadi kita bisa mengakses semua class yang ada didalam namespace Policy dengan memanggil ActInsurance.Policy. Namespace dapat diibaratkan seperti folder yang biasa kita gunakan untuk mengelompokan file. Namespace juga bersifat hirarki sama seperti folder. Dengan menggunakan namespace 32
kode yang kita buat dapat dikelompokan menjadi lebih rapi dan terstruktur. Namespace ActInsurance penting karena digunakan untuk membedakan dengan program lain, misal untuk perusahaan asuransi Ecme juga memiliki namespace EcmeInsurance dan didalamnya memiliki namespace dengan nama sama yaitu Policy tapi implementasi class-class yang ada di dalamnya berbeda dengan namespace Policy pada namespace ActInsurance yang sudah dibuat sebelumnya. Untuk mengakses Policy pada EcmeInsurance digunakan EcmeInsurance.Policy sedangkan untuk mengakses Policy pada ActInsurance digunakan ActInsurance.Policy. Dengan menggunakan namespace kita tidak akan bingung untuk mengakses class-class yang kita inginkan karena sudah dikelompokan dengan terstruktur dan dibedakan dengan nama namespacenya. VB6 Note: Jika kita membandingkan namespace dengan Windows API pada VB6, maka dapat dilihat bahwa penggunaan namespace pada .NET lebih rapi, terstruktur dan mempermudah developer. Windows API hanya mendukung penggunaan single namespace dengan ribuan function didalamnya yang akan sangat menyulitkan dalam pemberian nama dan pengelompokan function. Jika kita melihat BCL (Base Class Library) / FCL (Framework Class Library) yang ada pada .NET, ribuan class library tersebut dikelompok-kelompokan kedalam lebih dari 100 namespace. Misal untuk menggunakan class-class untuk membuat GUI pada aplikasi windows anda dapat menggunakan namespace System.Windows.Form. untuk lebih jelasnya ada dapat membuka Visual Studio 2008 Documentation, arahkan ke .NET Development - .NET Framework SDK .NET Framework - .NET Framework Class Library. 33
Assemblies
Setelah pada topik sebelumnya kita membahas tentang namespaces untuk mengelompokan class-class yang kita buat, sekarang kita akan belajar untuk menggunakan namespace. Untuk menggunakan namespace pada aplikasi yang anda buat, anda butuh untuk mengakses assembly yang tepat yang berupa file fisik (.dll atau .exe) yang mengandung kode yang sudah anda compile. Misal jika anda ingin menggunakan namespace System.Windows.Form maka anda harus mengakses file System.Windows.Form.dll (biasanya nama 34
namespace sama dengan nama assembly namun bisa saja lain walau tidak disarankan).
Types
Setelah membaca tentang Class Library anda mungkin bertanya apa yang ada didalam Class Library, jawabannya adalah Types. Types pada .NET terdiri dari classes, event, structure, dan beberapa fitur baru seperti enumeration dan delegates. Model ini sangat berbeda dengan VB classic (VB6), VB6 memiliki beberapa object bawaan seperti Printer, Screen, App dan Err, anda juga dapat mengakses COM jika ingin komponen yang lebih lengkap. Lain halnya dengan VB9 yang sudah memiliki ratusan object yang dikelompokan dalam namespace pada .NET Class Library. Class, Object dan Instance Mungkin anda pernah bertanya apa sich bedanya class dan object?, ilustrasi ini mungkin bisa menjelaskan perbedaannya. Jika anda ingin membangun rumah Class adalah blueprint / gambar (berisi spesifikasi lengkap dari rumah yang akan dibuat, ukuran, jumlah, dll). Sedangkan object adalah bentuk fisik / rumah yang dibangun berdasarkan blueprint / class yang sudah ada.
Sebuah class terdiri dari properties, method, dan events (yang biasa disebut dengan member). 35
Instance adalah copy unik dari class yang merepresentasikan object. Untuk menggunakan class anda harus membuat instance terlebih dahulu baru dapat mengakses class member, kecuali anda menggunakan shared member, maka anda tidak perlu membuat instance untuk mengakses member yg ada dalam class tersebut. Properties Properties menyimpan informasi tentang object yang dibuat. Sebagai contoh pada aplikasi windows object TextBox memiliki property Text, yang berisi teks yang akan ditampilkan pada textbox. Jika anda memiliki texbox dengan nama txtNama maka anda dapat menuliskan strNama = txtNama.Text untuk mengcopy nilai dari textbox ke variabel strNama. Method Method adalah perintah yang membuat object melakukan sesuatu. Sebagai contoh MessageBox.Show() menggunakan Show() method dari MessageBox object untuk menampilkan pesan, dan MyDoc.Print() menggunakan Print() method menggunakan MyDoc object untuk mengirimkan data ke printer. Penulisan method pada VB9 diikuti dengan tanda kurung (). Events Events adalah notifikasi yang dikirimkan oleh object, dimana anda dapat listen atau ignore notifikasi tersebut. Sebagai contoh object button mengirimkan Click event, dan anda dapat merespond event tersebut dan menjalankan code anda. Instance Member dan Shared Member 36
Bagi pemula salah satu aspek yang paling membingungkan pada OOP adalah Instance dan Shared member. Anda dapat menggunakan member pada class dengan cara membuat instance terlebih dahulu, kemudian baru dapat mengakses member yang ada di dalamnya, tapi pada kasus tertentu anda juga dapat langsung mengakses member tersebut tanpa harus membuat instance, caranya adalah menggunakan keyword shared pada member.
37
3. Misal anda ingin menggunakan class library untuk enkripsi file, maka anda dapat menambahkan referensi dengan cara klik kanan pada references, kemudian pilih Add Reference, akan muncul daftar library yang dapat digunakan, kemudian pilih System.Security.
38
4. Setelah menambahkan library System.Security, langkah berikutnya adalah menggunakannya pada program yang kita buat. 5. Cara untuk menggunakan referensi yang telah kita tambahkan pada program adalah dengan menggunakan keyword Imports dan menyebutkan nama namespace dengan lengkap. 6. Pada form tambahkan control berikut:
Control TextBox TextBox Button Property Name Name Name Text Value txtPassword txtMd5 txtProses Proses
39
Private Sub btnProses_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProses.Click Dim md5Obj As New MD5CryptoServiceProvider Dim byteToHash() As Byte = Encoding.ASCII.GetBytes(txtPassword.Text) byteToHash = md5Obj.ComputeHash(byteToHash) txtMd5.Text = Convert.ToBase64String(byteToHash, 0, byteToHash.Length) End Sub End Class
8. Pada kode diatas kita menggunakan keyword Imports System.Security.Cryptography agar dapat menggunakan class MD5 yang ada didalam namespace tersebut. MD5 adalah salah satu algoritma standar untuk menghitung fungsi hash (biasanya digunakan untuk mengenkripsi password). Dapat kita lihat pada contoh diatas bahwa .NET Framework sudah menyediakan koleksi library yang banyak, sehingga anda tidak perlu membuat sendiri dari awal. Koleksi class library pada .NET Framework juga sangat terstruktur sehingga memudahkan kita dalam melakukan pencarian.
keseluruhan file pada project anda. Caranya klik kanan pada project, kemudian pilih properties, dan pilih references tab.
Anda dapat menambahkan System.Security kedalam References dan mencontreng System.Security.Cryptography pada Imported namespace agar tidak perlu menuliskan Imports System.Security.Cryptography di setiap file.
Menggunakan Aliases
Anda juga dapat menggunakan alias pada Imports statement, alias akan sangat berguna jika anda mengimport beberapa namespace yang didalamnya memiliki nama class yang sama.
Imports sc = System.Security.Cryptography Imports wf = System.Windows.Forms Dim objMd5 As New sc.MD5CryptoServiceProvider wf.MessageBox.Show("Hello !!")
disini akan dijelaskan beberapa namespace untuk memberikan gambaran singkat kepada anda. System Ini adalah core namespaces yang berisi basic data types seperti string, array, events dan exception yang akan anda pelajari di bab selanjutnya. System.Collection dan System.Collection.Generic Namespace ini berisi class-class collection. Collection adalah object yang dapat mengadung group dari object. System.Data Namespace ini berisi types yang dibutuhkan oleh ADO.NET jika anda ingin bekerja dengan database seperti Sql Server atau Oracle. System.Drawing Namespace ini berisi class-class yang digunakan jika anda hendak bekerja dengan font, color, dan menggambar langsung pada form. Fitur-fitur tersebut dibundle menjadi satu koleksi yang dinamakan GDI+. System.Drawing.Printing Ini adalah namespace yang berisi class-class untuk mensupport fasilitas print dan print preview. System.IO Namespace ini berisi class-class yang digunakan untuk mengakses file termasuk manajemen file, membaca, dan menulis ke file. 42
System.Net Namespace ini berisi class-class yang digunakan untuk komunikasi jaringan secara low-level, misal anda ingin mengambil data dari web tanpa menggunakan ASP.NET. System.Runtime.Serialization Ini adalah class library yang berisi beberapa namespace yang digunakan untuk serialisasi object. System.Threading Namespace ini digunakan jika anda hendak membuat program aplikasi yang multithread. System.Web Digunakan jika anda ingin membuat aplikasi berbasis web dengan menggunakan ASP.NET. System.Windows.Forms Namespace ini menyediakan semua types yang dibutuhkan jika anda hendak membuat aplikasi berbasis Windows Desktop, termasuk control textbox, button, dll. System.Xml Namespace ini digunakan jika anda hendak bekerja dengan dokumen XML. Microsoft Visual Basic
43
Ini adalah small namespace yang berisi fungsi-fungsi dari VB6 (VB Classic) yang dapat digunakan di .NET seperti string manipulation function (left(), right()). Selain yang disebutkan diatas masih banyak namespace yang lain yang ada di .NET Framework seperti untuk security, untuk mengakses FTP, Regular Expression, Advanced String Manipulation, dll.
Menggunakan My Object
Setelah VB7 direlease (.NET 1.0), Microsoft menyadari bahwa developer VB kesulitan dalam menemukan class-class yang akan digunakan, karena Class Library yang ada di .NET terlalu banyak dan besar. Karena alasan tersebut VB Team dari Microsoft mencoba membuat shortcut untuk mengakses class-class penting yang sering digunakan dengan membuat sebuah object dengan nama My object. Sayangnya My object hanya menyediakan shortcut untuk mengakses sebagian kecil dari Framework Class Library yang sangat banyak, karena jika terlalu banyak My object akan semakin besar dan kompleks, ini akan menyulitkan programer untuk mempelajarinya, karena cara pengaksesannya yang tidak standar. Dengan menggunakan My object anda dapat bekerja dengan lebih cepat, misalnya anda ingin mengetahui informasi dari komputer anda seperti waktu, username, computer name, dan directory, anda dapat menuliskanya seperti ini:
MessageBox.Show(My.Computer.Clock.LocalTime) MessageBox.Show(My.Computer.Name) MessageBox.Show( My.Computer.FileSystem.CurrentDirectory) MessageBox.Show(My.User.Name)
My Core Object
44
Untuk memudahkan penggunaan My object Visual Studio sudah menyediakan intellisense sehingga pengguna mudah mencari object yang dibutuhkan. My object dibagi menjadi 7 sub bagian pokok yaitu: My.Computer : berisi object yang digunakan untuk mengambil informasi dari komputer. Misal anda dapat mengakses clipboard (My.Computer.Clipboard), memainkan lagu (My.Computer.Audio), mengambil informasi dari registery (My.Computer.Registery dan My.Computer.FileSystem), dan mengecek network status (My.Computer.Network). My.Application : menyediakan informasi tentang aplikasi yang anda buat termasuk assembly dan version number, dan folder dimana aplikasi anda dijalankan. My.User : object ini menyediakan informasi tentang user yang sedang login pada computer, anda dapat menggunakan object ini untuk menuliskan security code yang mengecek user account atau group membership. My.Setting : digunakan untuk mengambil informasi dari application configuration file. My.Resources : digunakan untuk mengambil resources (binary atau text data yang dimasukan kedalam project pada saat kompilasi, misal: image, sound). My.Form : adalah default instance yang digunakan pada setiap form, dapat digunakan untuk memanggil form yang lain yang ada dalam satu project. My.Webservices : object ini menyediakan default proxy object untuk setiap web services yang digunakan pada aplikasi anda.
Code Files
45
Pada Visual Basic 6 dan pendahulunya, terdiri dari beberapa file dengan tipe tertentu yang membentuk project, Form file (.frm) yang berisi Graphical layout dan event handling code dari form, class files (.cls) yang berisi single class yang anda buat sendiri, Module files (.mod) yang mengandung variable dan function yang dapat diakses secara global. File-file yang sudah disebutkan diatas dikelompokan menjadi sebuah group yang deskripsinya ditulis pada Visual Basic project file (.vbp). Karena jenis file yang bervariasi maka akan relatif sulit untuk memaintain file-file tersebut. Namun VB9 memiliki model manajemen file yang berbeda dengan VB6, yaitu: Ketika anda membuat aplikasi baru maka secara otomatis anda membuat file solution (.sln). Satu solution dapat berisi satu atau lebih project file (.vbproj).
Solution (.sln)
Gambar 3.6 Solution File
Satu project terdiri dari banyak code file (.vb) yang dapat berisi multiple class, module, dan form. 46
Didalam class atau modul anda dapat menambahkan procedure atau menuliskan code seperti biasa, tapi anda tidak dapat menambahkan procedure atau variable declaration diluar class atau module.
Public bil As Double 'Tidak boleh Public Class LatihanClass Private nim As String 'Boleh Public Sub MySub() 'Boleh 'tulis kodenya disini End Sub End Class Public Sub Hello() 'Tidak benar End Sub Public Module MyModule Public Sub Hello() 'Boleh 'tulis kodenya disini End Sub End Module
Semua class dan module yang anda buat terdapat dalam root namespace (namanya sama dengan nama project anda), 47
pada VB9 root namespace ini tidak kelihatan. Jadi jika anda ingin mengakses method Hello() didalam module MyModule maka anda dapat menuliskannya sebagai berikut MyProject.MyModule.Hello().
Namespace Block
Semua code yang anda buat secara otomatis disimpan dalam root namespace, secara default VB9 akan menggunakan nama dari aplikasi/project anda sebagai root namespace. Untuk melihat nama root namespace klik kanan pada project kemudian pilih properties, kemudian lihat pada textbox Root Namespace, anda dapat mengubah nama namespacenya jika diinginkan. Anda juga dapat mengubah nama dari assembly (ini akan sama dengan nama file .exe yang akan dihasilkan). Anda dapat menggunakan namespace untuk membantu mengorganisasikan kode pada aplikasi yang besar dan kompleks. Untuk menggunakan namespace tulis program anda didalam kalang namespace.
Namespace MyNamespace Module MyModule Public Sub MySub() 'tulis kode disini End Sub End Module End Namespace
Pada contoh diatas and adapt mengakses subrutin MySub dengan menuliskan MyNamespace.MyModule.MySub().
Tipe Data
Hampir semua tipe data yang ada di VB6 terlihat sama dengan yang ada di VB9. Misalnya code berikut masih valid.
Dim intBil As Integer Dim strNama As String Dim tanggal As Date
Biarpun terlihat sama tapi ada beberapa perbedaan yang mendasar yaitu semua tipe data pada VB9 terdapat dalam namespace khusus yaitu System. Sebagai contoh keyword Date sebenarnya sama dengan System.DateTime, dan keyword String sebenarnya merepresentasikan System.String, ini yang disebut sebagai CTS (Common Type System).
Tipe data value type disimpan pada stack memory, tidak bersifat garbage collected. Value type diturunkan dari System.ValueType namespace. Jenis data value type memiliki copy data masing-masing, sehingga perubahan nilai pada satu variable tidak berpengaruh pada variable yang lain. Contoh jenis tipe data value type adalah: Simple o o o o o o Types : signed : Sbyte, Short, Integer, Long unsigned : Byte, Ushort, Uint, Ulong unicode characters : Char floating point : Single, Double high precission: Decimal boolean : Boolean
Struct Types o user defined type: Structure..End Structure Contoh penggunaan Value Type pada program:
Dim bil1 As Integer = 5 Dim bil2 As Integer = bil1 'bil2 juga bernilai 5 bil2 = 7 'bil2 dirubah nilainya menjadi 7 'bil1 tetap bernilai 5 dan bil2 bernilai 7 MsgBox("bil1 : " & bil1 & " bil2 : " & bil2)
Dari program diatas dapat dilihat bahwa biarpun bil1=bil2 namun perubahan nilai pada bil2 tidak menyebabkan bil1 berubah, ini disebabkan karena value type memiliki copy data pada masing-masing variable.
Category Signed integer Bits Type 8 16 32 Sbyte Short Range/Precision 128...127 32,768...32,767
Integer 2,147,483,648...2,147,483,647
50
Uinteger 0...4,294,967,295
1.5 x 10 5.0 x 10
28
to 1.7 x 10
28
, 15-digit precision
128 Decimal
1.0 x 10
Reference Type Berbeda dengan value type yang dialokasikan di stack memory, reference type dialokasikan di heap memory. Reference type juga bersifat garbage collected sehingga akan otomatis dibersihkan oleh CLR jika object sudah tidak digunakan lagi. Reference type diturunkan dari System.Object namespace. Satu object dapat direferensi oleh lebih dari satu object yang lain, jadi perubahan nilai pada object referensi yang sama akan mempengaruhi nilai pada object yang lain. Reference type mirip dengan tipe pointer pada bahasa C. Yang termasuk jenis tipe data Reference Type: Class Type o Base class dari semua class : Object o Unicode string : String o User defined type : Class..End Class Interface Type o User defined type : Interface..End Interface Array Type o Single dan multidimensi : Dim nama(3) As String, Dim matrix(2, 2) As Integer Delegate Type 51
Listing 3.2 Penggunaan Reference Type 1. Buat project windows LatihanTypes. application dengan nama name=
3. Klik kanan pada project kemudian tambahkan class baru dengan nama Mahasiswa.vb. tulis kode berikut:
Public Class Mahasiswa Public nim As String Public nama As String Public ipk As Double End Class
52
Pada contoh program diatas dapat dilihat bahwa jenis tipe data reference type berbeda dengan value type, karena jika objMhs2 mereferensi ke objMhs1, dan objMhs3 mereferensi ke objMhs2, maka ketika anda merubah field nama pada objMhs2 maka otomatis fields nama pada objMhs1 dan objMhs3 ikut berubah karena mempunyai satu referensi object yang sama.
System Types
Tipe yang ada pada System namespace dapat digunakan oleh semua .NET Language (VB, C#, C++), dengan begitu anda dapat membuat program dengan bahasa berbeda dan kemudian mengintegrasikannya tanpa masalah. Jika anda ingin mengupgrade program yang ada di VB6 maka anda harus menyesuaikan dengan CTS yang ada di .NET. Sebagai contoh Integer pada VB9 sama dengan System.Int32 pada CTS, karena Int32 maka range nilainya dari -2M sd 2M, ini 53
jauh lebih besar daripada range tipe Integer pada VB6 yang hanya 16bit (-32.000 sd 32.000).
Dim intBil1 As Integer '32 bit integer Dim intBil2 As System.Int32 '32 bit integer
Tipe String pada VB9 juga relatif sama dengan VB6 kecuali sekarang anda tidak lagi dapat menggunakan fixed-length string.
Pada VB6 jika anda menuliskan statement diatas maka artinya anda mendeklarasikan intC sebagai tipe Integer, dan intA, dan intB sebagai tipe varian (varian adalah tipe variable default di VB6). VB9 sudah tidak lagi mendukung varian, jika anda ingin mendeklarasikan variable yang dapat diisi dengan nilai yang tipenya berbeda, maka anda dapat menggunakan tipe yang umum yaitu System.Object.
Initializer
Initializer adalah salah satu fitur yang mempermudah anda dalam memprogram, anda dapat memberi nilai pada vaiable yang anda deklarasikan sevara langsung.
Dim intBil1 As Integer
Dapat juga digunakan untuk membuat object, dan langsung menginisiaisasinya menggunakan konstruktor.
Dim myFile As System.IO.FileInfo = New System.IO.FileInfo("d:\vbnet.txt")
54
Anda juga dapat membuat variable didalam statement program yang lain, seperti pada pemanggilan function. Tapi ini dapat membuat kode anda sulit untuk dibaca.
AmbilInfoFile(New System.IO.FileInfo("d:\vbnet.txt"))
String
Pada .NET tipe String adalah object dari System.String. Karena String merupakan object maka sudah tersedia methodmethod bawaan untuk manipulasi string. Misalnya anda dapat menggunakan method Length() untuk mengetahui panjang String.
Dim nama As String = "Erick Kurniawan" 'anda dapat menggunakan cara lama Dim jml As Integer = Len(nama) 'atau menggunakan cara baru pada .NET Dim pjng As Integer = nama.Length
Cara pertama yang menggunakan method len() tidak disarankan untuk digunakan karena mungkin anda tidak dapat menghapalkan semua built-in function yang jumlahnya ribuan. Kelemahan kedua adalah buit-in function ini tidak terorganisasi dengan baik jadi kita tidak tahu function yang digunakan masuk dalam kategori apa. Cara kedua lebih disarankan karena lebih terorganisir, function Length() ada pada class System.String jadi lebih mudah untuk menemukannya. Dengan cara kedua anda juga dibantu oleh intellisense pada Visual Studio sehingga lebih memudahkan.
Anda juga dapat menggunakan function yang lain yang ada pada System.String. Jika anda ingin melihat detail function apa saja yang dipunyai oleh System.String anda dapat membuka MSDN documentation.
Dim myName As String = " Erick Kurniawan " 'huruf besar dan menghilangkan spasi kanan kiri MessageBox.Show(myName.ToUpper().Trim()) 'memotong string dari karakter ke 1 sebanyak 5 Dim potong As String = myName.Substring(1, 5) MessageBox.Show(potong) 'konversi integer to string Dim bil As Integer = 14 Dim strBil As String = bil.ToString()
VB6. Fungsi-fungsi string yang lama pada VB6 masih disupport (backward compatibility), hanya lebih disarankan menggunakan cara Object Oriented yang lebih elegant.
Kode diatas akan sangat tidak efisien dan sangat jelek dalam performa karena String pada VB9 bersifat immutable, jadi ketika anda menggunakan operator &= untuk menambahkan string baru ke string yang lama sebenarnya 56
operasinya tidak sekedar ditambah tapi membuat object string baru lagi. Untuk menangani sifat string yang immutable maka jika anda ingin secara dinamis menambahkan string disarankan menggunakan object StringBuilder. StringBuilder memiliki method Append() untuk menambahkan string, cara ini jauh lebih efisien dan lebih cepat dari sisi performa. Untuk menggunakan StringBuilder anda harus mengimport namespace System.Text. Untuk mengkonversi StringBuilder menjadi string biasa anda dapat menggunakan method ToString().
Imports System.Text Dim sb As New StringBuilder For i = 1 To 10000 sb.Append(i.ToString()) Next Dim strTmp As String = sb.ToString
57
MessageBox.Show(myDate.Day) 'mengurangi satu hari dengan fungsi bawaan myDate = myDate.AddDays(-1) MessageBox.Show(myDate.Day)
Array
Array pada VB9 selalu berawal dari index 0 untuk meyesuaikan dengan class library pada .NET (ini berbeda dengan VB6 yang mempunyai index 1 di beberapa tipe collection tertentu). Untuk mendeklarasikan array anda harus menuliskan batas atas (upper boundary) dari array tersebut.
Dim arrNama(10) As String 'membuat 11 element dari 0 sd 10 Dim arrBil1(1 To 10) As Integer 'tidak boleh karena lower bound harus 0 Dim arrBil2(0 To 10) As Integer 'boleh
Array pada .NET ukurannya terbatas (mempunyai limit), jika anda ingin tipe koleksi yang lebih fleksible maka anda dapat menggunakan object oriented type collection.
melakukan iterasi terhadap semua elemen dalam array menggunakan keyword For..Each, cara ini lebih mudah dibandingkan anda melakukan perulangan dari index ke 0 sampai dengan batas atas array seperti yang biasa anda lakukan. Namun dengan menggunakan For..Each anda hanya dapat membaca elemen saja (readonly), tidak untuk mengubah datanya.
Dim arrNama() As String = {"erick", "rully", "budi", "bayu"} 'mengambil semua elemen pada arrNama For Each nama In arrNama 'memasukan nilai kedalam list lstNama.Items.Add(nama) Next
Parameter 0 yang diberikan mempunyai arti dari elemen yang pertama (Pada VB9 array dimulai dari index ke 0). Karena batas bawah sudah pasti 0, sebenarnya anda dapat langsung menuliskan 0 daripada menggunakan GetLowerBound(0). 59
Dua method diatas menggantikan fungsi LBound() dan UBound() pada VB6 meskipun anda masih dapat menggunakan dua fungsi lama ini, tapi tidak disarankan. Class Array juga menyediakan shared method (akan dibahas di chapter 5 tentang OOP), anda harus menuliskan nama class baru kemudian nama shared methodnya.
Dim arrBil() As Integer = {12, 45, 22, 66, 11} akan diurutkan secara ascending Array.Sort(arrBil) For Each bil In arrBil lstNama.Items.Add(bil) Next
Anda juga dapat melakukan pencarian alamat index array dengan mudah.
Dim arrNama() As String = {"erick", "rully", "budi", "bayu"} 'jika ditemukan akan mengembalikan alamat dari elemen 'jika tidak ditemukan akan mengembalikan -1 Dim pos As Integer = Array.IndexOf(arrNama, "budi") MessageBox.Show(pos)
Untuk mengetahui method-method yang ada dalam class Array anda dapat melihat referensi class library.
60
Dim intBil2 As Integer = intBil1 'jika intBil2 nilainya diubah menjadi 34 intBil2 = 34 'maka nilai intBil1 tidak berubah tetap 12 MessageBox.Show(intBil2) 'berbeda dengan array yang reference type Dim arrBil1() As Integer = {12, 34, 56, 12, 44} 'statement ini artinya arrBil1 dan arrBil2 mereferensi ke object yang sama Dim arrBil2() As Integer = arrBil1 'jika salah satu elemen arrBil2 dirubah maka elemen pada arrBil1 juga ikut berubah arrBil2(2) = 99 MessageBox.Show(arrBil1(2)) 'jika anda tidak ingin mereferensi ke object array yang sama, tapi hendak membuat object baru maka anda dapat menggunakan method clone() Dim arrBil3() As Integer = {2, 3, 4} Dim arrBil4() As Integer = arrBil3.Clone() 'jika elemen pada arrBil4 diubah maka sudah tidak berpengaruh pada arrBil3 karena beda referensi object arrBil4(2) = 55 MessageBox.Show(arrBil3(2))
Anda dapat menggunakan method clone() untuk membuat object baru sekaligus mengkopi datanya jika tidak menghendaki kedua variable tersebut mengacu ke object yang sama.
Assigment Shorthand
61
VB9 menyediakan langkah yang lebih mudah untuk bekerja dengan operator arithmatic, cara ini sama dengan yang ada pada bahasa C pada umumnya.
Dim intBil As Integer = 12 intBil += 2 'sama dengan intBil = intBil + 2 intBil -= 2 intBil *= 2 intBil /= 2 Dim strNama As String = "Erick " 'sama dengan strNamaa & "Kurniawan" strNama &= "Kurniawan"
62
Maka untuk menghindari error-error yang tidak terdeteksi seperti contoh diatas disarankan untuk mengubah opsi Option Strict menjadi On. Konversi otomatis yang dilakukan oleh compiler (late binding) juga menyebabkan performa program anda menjadi lebih lambat. Namun pada kasus tertentu penggunaan Option Strict menjadi Off amat membantu terutama jika anda membutuhkan late binding. Late binding digunakan jika kita tidak tahu persis tipe dari objectnya. Ketika proses late binding sebenarnya tipe data dirubah menjadi object terlebih dahulu
'Contoh late binding Dim objData As Object objData = 34 'menghasilkan System.Int32 MessageBox.Show(objData.GetType().ToString) objData = "Hello" 'menghasilkan System.String MessageBox.Show(objData.GetType().ToString)
Anda dapat mengubah setting Option Strict dengan cara klik kanan pada project properties pilih tab compile.
Jika setting Option Strict menjadi On maka anda harus melakukan konversi secara eksplisit. Anda dapat menggunakan method Ctype() atau method yang ada pada System.Convert.
Dim intBil As Integer = 12 'konversi data menggunakan method Ctype() Dim dblBil As Double = CType(intBil, Double) 'menggunakan System.Convert Dim dblBil2 As Double = Convert.ToDouble(intBil)
63
'menggunakan method bawaan Cdbl, Cint, Cstr Dim dblBil3 As Double = CDbl(intBil) Dim strBil As String = CStr(dblBil)
Fungsi Matematika
.NET mempunyai class Math yang berisi shared method untuk operasi matematika. Misal untuk menampilkan konstanta pi, menghitung sinus, cosinus, log, dan operasi yang lain.
Dim num num num num num num num As Double = Math.PI 'konstanta pi 22/7 = Math.Sqrt(25) 'akar 25 = Math.Sin(30) = Math.Abs(-30) 'fungsi absolut 30 = Math.Round(25.6745, 2) 'pembulatan 25.67 = Math.Log(1.44)
Random Numbers
Tidak seperti di VB6, VB9 menyediakan class System.Random sehingga mudah untuk menggenerate angka random. Misal contoh dibawah ini akan menggenerate angka random.
Dim rnd As New Random Dim intBil As Integer 'menggenerate nilai random dari 0 sd 5 intBil = rnd.Next(5) 'menggenerate nilai random dari 1 sd 6 intBil = rnd.Next(5) + 1
Scope Variable
Ada beberapa aturan yang perlu dipahami tentang scope variable di .NET karena berbeda dengan VB6. Pada VB9 private variable yang dideklarasikan didalam class atau module tidak 64
dapat diakses oleh semua code diluar class atau module tersebut. Semua variable dalam method (sub atau function) juga tidak dapat diakses oleh kode diluar method tersebut, dan semua variable yang ada didalam loop atau conditional block juga tidak dapat digunakan oleh code diluar loop atau conditional block.
Sub ScopeVar() Dim nama As String = "Erick" End Sub Sub Hello() 'variable nama di sub ScopeVar() tidak dapat diakses di sub Hello() nama = "Budi" End Sub For i As Integer = 1 To 10 lstNama.Items.Add(i.ToString) Next 'variable i pada loop tidak dapat digunakan di luar block loop i = 12 Dim cek As Boolean = True If cek = True Then Dim bil As Integer = 3 End If 'variable bil tidak dapat diakses diluar blok if bil = 33
kemampuan untuk mengecek hanya sebagian dari satu statement kondisi yang panjang.
Dim nama As String = "Erick" Dim ipk As Double = 3.4 If nama = "budi" And ipk > 2.6 Then 'tulis kode disini End If
Pada program diatas kondisi pertama akan dicek terlebih dahulu kemudian kondisi kedua juga dicek, padahal untuk operator And jika salah satu kondisi sudah false maka kondisi tersebut tidak akan menghasilkan true jadi seharusnya kodisi kedua tidak perlu dicek lagi (pada operator And jika salah satu kondisi false maka hasilnya juga pasti false). Dengan menggunakan AndAlso maka ketika kondisi pertama sudah menghasilkan false maka kondisi kedua tidak perlu dicek karena kondisi tersebut sudah pasti menghasilkan false.
Dim nama As String = "Erick" Dim ipk As Double = 3.4 'kondisi kedua tidak dicek karena kondisi pertama sudah false maka pasti hasil akhirnya false If nama = "budi" AndAlso ipk > 2.6 Then 'tulis kode disini End If
Demikian juga dengan operator logical Or jika salah satu kondisinya sudah true maka seharusnya kondisi yang lain tidak perlu dicek karena hasil akhirnya pasti menghasilkan true.
'kondisi pertama true, kondisi kedua false, logika Or jika salah satu true maka hasil pastri true jadi kondisi kedua tidak perlu dicek lagi. If nama = "erick" OrElse ipk > 3.6 Then 'tulis kode disini End If
Dengan menggunakan short-circuit evaluation ini maka kode menjadi lebih efisien dan akan meningkatkan performa. 66
Pemanggilan Method
Ada sedikit perubahan pemanggilan method pada VB9 dibandingkan dengan VB6 yaitu sekarang anda harus menggunakan kurung buka tutup untuk memanggil method.
'pada VB6 tidak harus menggunakan kurung buka tutup MsgBox "Hello World ", vbOKOnly 'harus menggunakan kurung buka tutup hasil = MsgBox("Hapus File?", vbYesOrNo, "Konfirmasi") 'pada VB9 semua harus menggunakan kurung buka tutup 'pada VB9 method MsgBox diganti dengan MessageBox Class MessageBox.Show("Hello VB !", "Info", _ MessageBoxButtons.OK)
67
VB9 menggunakan kurung buka tutup disetiap method yang dipanggil bahkan ketika method tersebut tidak mempunyai parameter.
Form1.Show()
Function Segitiga(ByVal alas As Double, _ ByVal tinggi As Double) As Double alas += 2 tinggi += 2 Return 0.5 * alas * tinggi End Function Private Sub btnByVal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnByVal.Click Dim alas As Double = 12 Dim tinggi As Double = 14 'ByVal = nilai dari method pemanggil dicopy ke method Dim luas As Double = Segitiga(alas, tinggi) MessageBox.Show(luas.ToString) 'tetap bernilai 12 walaupun pada method ditambah 2 MessageBox.Show(alas.ToString) 'tetap bernilai 14 walaupun pada method ditambah 2 MessageBox.Show(tinggi.ToString) End Sub
69
berubah Dim luas As Double = LuasLingkaran(panjang, lebar) MessageBox.Show(luas.ToString) 'menjadi 14 karena ditambah 2 pada function MessageBox.Show(panjang.ToString) 'menjadi 16 karena ditambah 2 pada function MessageBox.Show(lebar.ToString) End Sub
Keyword Return
Salah satu fitur yang sangat membantu pada keyword return yang ada di VB9 adalah anda dapat menuliskan:
Function Kali(ByVal bil1 As Double, ByVal bil2 As Double) As Double 'sekarang anda dapat menuliskan statement return bil1*bil2 daripada hasil = bil1*bil2 Return bil1 * bil2 End Function
70
Dim tampil As String = _ GetMahasiswa("23092321", "Erick", _ "Gowongan", "SI") MessageBox.Show(tampil) End Sub
Jadi dengan VB9 anda dapat membuat parameter yang jumlah parameternya belum pasti. Ini akan sangat berguna ketika anda bekerja dengan aplikasi office dengan VB.
Default Value
Anda juga dapat membuat method yang parameternya belum tentu digunakan oleh user, dengan menggunakan keyword Optional tapi anda harus memberi default valuenya jika parameter tersebut optional. Jika parameter tidak diisi maka otomatis nilai yang akan digunakan adalah nilai defaultnya.
Function GetDosen(ByVal nik As String, _ Optional ByVal nama As String = "Erick", _ Optional ByVal alamat As String = "") As String Return "Nik :" & nik & " Nama :" & nama & " Alamat :" & alamat End Function Private Sub btnDefault_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDefault.Click Dim tampil As String = "" 'anda dapat mengisi semua parameter tampil = GetDosen("12345", "Erick", "Gowongan") 'atau dapat diisi hanya 2 parameter, yg Optional boleh tida diisi tampil = GetDosen("12345", , "Gowongan") 'atau hanya 1 parameter saja tampil = GetDosen("12345") End Sub
Method Overloading
71
VB9 mempunyai fitur untuk membuat fungsi dan subrutin dengan lebih fleksible. Pada VB9 anda dapat membuat fugsi atau subrutine dengan nama yang sama tapi jumlah parameter atau tipe datanya harus berbeda biasa disebut method overloading (menggunakan keyword Overload).
Public Overloads Function Tambah(ByVal bil1 As Integer, ByVal bil2 As Integer) As Integer Return bil1 + bil2 End Function Public Overloads Function Tambah(ByVal bil1 As Double, ByVal bil2 As Double) As Double Return bil1 + bil2 End Function Public Overloads Function Tambah(ByVal bil1 As Integer, ByVal bil2 As Integer, ByVal bil3 As Integer) As Integer Return bil1 + bil2 + bil3 End Function Private Sub btOverload_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btOverload.Click Dim dblHasil As Double = Tambah(2.2, 2.2) Dim intHasil As Integer = Tambah(2, 2) Dim intHasil2 As Integer = Tambah(12, 13, 14) End Sub
Jika anda perhatikan kode diatas terdapat 3 fungsi dengan nama sama yaitu Tambah, jumlah parameternya sama namun tipe data pada parameternya berbeda yaitu Integer dan Double, pada method yang ketiga nama dan tipe fungsi sama tapi jumlah parameternya yang berbeda.
Delegates
VB9 mempunyai fitur menarik yaitu delegates untuk membantu anda berkerja dengan fungsi dan subrutin. Delegates adalah variable khusus yang dapat menyimpan lokasi dari method (mereferensi ke method). Sebelum anda 72
delegate
anda
harus
mendeklarasikannya
Statement diatas tidak mendeklarasikan variable tapi mendefinisikan tipe delegates. Fungsi Proses adalah delegate yang dapat digunakan untuk menyimpan lokasi dari method yang signaturenya (parameter, tipe data, dan return valuenya) sama dengan fungsi Proses (mempunyai 1 parameter bertipe string dan mempunyai nilai kembalian berupa string pula). Kemudian anda dapat mendeklarasikan delegate variable sebagai berikut:
Dim myDelegate As Proses
Variable delegate hanya dapat menyimpan fungsi atau subrutin yang signaturnya sama dengan definisi delegate. Ini adalah kegunaan dari delegate yaitu memastikan bahwa anda mereferensi ke fungsi atau subrutin yang benar.
Public Function UbahCapital(ByVal nama As String) As String 'fungsi ini dapat disimpan referensinya karena 'mempunyai signature yang sama End Function Public Function UbahLower(ByVal nama As String, ByVal panjang As Integer) As String 'tidak dapat disimpan referensinya karena mempunyai 'signature yang berbeda End Function Public Sub UbahUpper(ByVal nama As String) 'tidak sesuai dengan signature karena bukan 'function End Sub
Jika anda sudah mendeklarasikan variable delegate maka cara untuk mereferensi fungsi atau subrutin adalah dengan menggunakan operator AddressOf. AddressOf memberitahu pada compiler bahwa variable tersebut mereferensi ke method 73
bukan untuk menjalankan methodnya. Signature dari method yang akan direferensi dengan signature delegate harus sama.
Public Function UbahCapital(ByVal nama As String) As String Return nama.ToUpper() End Function Private Sub btnPanggil_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPanggil.Click Dim myDelegate As Proses myDelegate = AddressOf UbahCapital End Sub
Setelah anda mereferensi method UbahCapital maka anda dapat menjalankan method yang direferensi dengan menggunakan variable delegate.
Dim strUpper As String = myDelegate("erick kurniawan") MessageBox.Show(strUpper)
Delegates adalah teknik yang sangat berguna karena dengan delegate anda dapat melakukan penambahan layer of indirection, sehingga kode yang anda buat lebih umum dan dapat digunakan kembali. Dibawah ini adalah contoh fungsi yang dapat menerima parameter berupa variable delegate.
'method yang menerima parameter berupa variable bertipe delegates Sub ProsesArray(ByVal strArr() As String, ByVal delFungsi As Proses) For i = 0 To strArr.GetUpperBound(0) strArr(i) = delFungsi(strArr(i)) Next End Sub 'cara pemanggilan methodnya Dim strArr() As String = {"erick", "rully", "naren", "wely"} ProsesArray(strArr, AddressOf UbahCapital)
Dengan menggunakan delegate parameter seperti kode diatas maka implementasi fungsi yang kita buat dapat lebih fleksible untuk diubah asalkan signaturenya sama dengan tipe delegate yang dideklarasikan. 74
75
76
VB atau C# tetap menggunakan class library yang sama untuk membuat aplikasi Windows Form.
77
Komponen Tray
Pada VB6 ketika anda menggunakan control yang tidak memiliki tampilan secara visual misalnya Timer control, anda akan menaruh komponen tersebut pada form yang sama dengan control lain yang memiliki tampilan visual seperti textbox dan button. VB9 memiliki area khusus untuk menaruh control yang tidak memiliki tampilan visual yaitu didalam Komponen Tray sehingga lebih mudah untuk pengaturannya.
Custom Designer
Pada VB6 beberapa control memiliki properti yang kompleks yang tidak dapat diisi dengan menambahkannya di menu properties, sebagai contoh adalah komponen Tree View yang sangat komplek. Tree View mempunyai nodes yang tidak dapat diisi pada saat design time, namun anda harus melakukan koding secara manual. Misal control ListBox sekarang mempunyai property Items dan anda dapat memilih tanda () disebelah properti tersebut untuk mengisi daftar list yang akan ditampilkan. 78
Mengunci Control
Untuk memastikan bahwa layout pada Windows anda tidak berubah-ubah anda dapat menggunakan fasilitas locking. Sama seperti pada VB6 anda dapat mengunci layout dari control anda dengan cara klik kanan pada form kemudian pilih Lock Control.
Pada VB9 fitur untuk mengunci kontrol dapat digunakan tidak hanya untuk keseluruhan control yang ada di form (seperti pada VB6), namun anda dapat mengunci posisi per control yang anda inginkan sehingga lebih fleksible. Untuk mengunci posisi per control anda dapat mengganti properti lock pada control menjadi true.
Anchoring
Dengan menggunakan anchoring maka control yang anda buat akan menyesuaikan ukuran dengan sendirinya ketika 79
anda merubah ukuran form, jadi anda tidak perlu menulis kode secara manual untuk resize seperti pada VB Classic. Anchoring adalah fitur yang sangat membantu anda dalam mendesign form. Anchor berperan seperti jangkar. Secara default control ter-anchor di posisi pojok kiri atas dari form, jadi ketika anda merubah ukuran form dengan cara menarik form ke arah kanan, maka control yang anda buat tidak otomatis berubah juga ukurannya. Jika anda menginginkan control tersebut ikut berubah jika ditarik ke kanan maka anda dapat merubah property anchor menjadi Top, Left, Right, jadi ketika anda menarik form kearah kanan control yang sudah anda set property anchornya akan ikut berubah ukurannya mengikuti form.
Pada contoh diatas Button2 akan berubah ukurannya ketika anda menarik form ke kanan.
juga
Docking
Properti docking pada control digunakan jika anda menginginkan control tersebut menempel pada posisi kiri, kanan, atas, bawah, atau seluruh form (fill). Dengan menggunakan docking control juga akan berubah ukurannya 80
jika anda merubah posisi form. Misal anda ingin control DataGridView memenuhi keseluruhan form dan akan ikut berubah posisinya jika anda mengubah ukuran form. Ubah properti Dock menjadi fill (pilih kotak bagian tengah).
Jika anda ingin mengatur beberapa control menggunakan docking, anda dapat memberi jarak pada kedua control tersebut dengan mengatur properti padding.
Automatic Scrolling
Automatic scrolling sangat membantu jika anda ingin menampilkan informasi yang banyak. VB9 mendukung scroll otomatis pada beberapa contol seperti Form dan Panel. Anda tinggal mengatur properti AutoScroll menjadi true.
81
Spilt Windows Split Windows adalah model design yang banyak digunakan pada aplikasi windows modern saat ini. Spilt Window juga banyak digunakan sebagai alternatif selain MDI Form karena lebih simple dan efisien. Untuk membuat split window anda harus menambahkan SplitContainer control, secara default split container terbagi menjadi dua bagian, anda dapat menambahkan control di bagian kiri dan kanan. Ketika menambahkan control jangan lupa untuk mengatur properti dock dari control tersebut agar ikut berubah jika form di resize. SplitContainer juga mempunyai properti Panel1MinSize dan Panel2MinSize untuk membatasi ukuran minimal panel tersebut dapat di resize. Misal pada contoh dibawah ini menggunakan dua control yaitu TreeView di panel kiri dan PictireBox di panel kanan.
82
Container Control Selain SplitContainer ada dua jenis container lagi yang sering digunakan yaitu Panel dan GroupBox. Panel control adalah dasar dari semua container control yang lain seperti SplitContainer yang terdiri dari dua panel di kiri dan kanan. Panel control juga memiliki fasilitas untuk scrolling, bedanya dengan GroupBox, Panel tidak memiliki properti caption. Ada beberapa control baru yang diturunkan dari Panel yaitu FlowLayoutPanel dan TableLayoutPanel. FlowLayoutPanel mirip dengan properti Layout pada CSS ketika anda mendesign web, control akan mengisi panel sampai batas panel tersebut, jika flow left berarti mengsi dari kiri jika sudah sampai batas form maka control tersebut akan mengisi bawahnya. TableLayoutPanel mirip seperti Grid jadi anda dapat meletakan control pada row-row yang anda di TableLayoutPanel.
83
Kemudian setelah memilih control, pilih event handler pada combobox sebelahnya.
Anda juga dapat mengisi event handler melalui menu properties pada design form.
84
Anda juga dapat melakukan double click pada control tersebut untuk menambahkan event handler, secara default jika anda double click pada button maka akan membuat event handler button_click, jika TextBox maka akan masuk textbox_TextChanged. Ini adalah contoh penanganan event handler ketika tombol di klik.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click MessageBox.Show("Hello Word !!") End Sub
Pada .NET setiap method untuk menangani event handler mempunyai dua parameter, yaitu sender yang mereferensi ke object yang mengirimkan event (pada contoh diatas adalah button), yang kedua adalah object e yang membungkus semua informasi tambahan yang dibutuhkan untuk event tersebut. Untuk event yang berbeda juga menggunakan tipe object yang berbeda juga pada object e. Secara default object e bertipe EventArgs yang tidak berisi informasi (pada button). Lain halnya dengan event mouse move, object e mengirimkan informasi posisi dari pointer mouse.
Private Sub Form1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove Label1.Text = "Posisi X: " & e.X & " Y: " & e.Y End Sub
Pada VB9 event handler terkoneksi dengan control menggunakan keyword Handles yang ada di akhir penulisan event handler. Listing 4.1 Menghandle lebih dari satu event 1. Buat windows form application baru, beri nama MultipleHandler. 2. Kemudian masukan 3 button kedalam form, beri nama btnA, btnB, dan btnC. 3. Buat event handler yang akan digunakan untuk ketiga tombol diatas.
Public Sub KlikHandle(ByVal sender As Object, ByVal e As EventArgs) Handles btnA.Click, btnB.Click, btnC.Click Dim tombol = CType(sender, Control) MessageBox.Show("Anda menekan tombol : " & _ tombol.Name) End Sub
4. Ketika anda melakukan klik pada ketiga button tersebut maka KlikHandle akan dijalankan.
(cancel). Misal anda mempunyai tombol dengan nama btnProses, anda dapat mengeset properti AcceptButton pada form menjadi btnProses sehingga ketika user menekan enter maka yang akan dijalankan adalah event click pada btnProses. Demikian juga dengan property CancelButton anda dapat mengisinya dengan tombol tertentu sehingga jika user menekan esc yang dijalankan adalah tombol tersebut. VB6. Fitur ini juga ada di VB6 tetapi harus menggunakan Default dan Cancel property pada button control.
Diturunkan oleh
Di-Instansiasi
Form Object
Seperti dapat dilihat pada gambar diatas, Custom Form (class form pada aplikasi anda) diturunkan dari class Form dalam namespace System.Windows.Forms, dan Custom Form 87
akan diinstansiasi untuk membuat object Form yang tampil pada aplikasi anda.
Pada kode diatas baris pertama anda membuat object frm2 kemudia baris kedua method show() digunakan untuk menampilkan form. Anda juga dapat menggunakan cara implicit seperti pada VB6, kodenya:
Form2.Show()
Cara ini menggunakan default insctance dari Form2, VB compiler akan secara otomatis mengcreate object Form2 ketika form tersebut dipanggil. Cara ini memang membuat programmer menjadi lebih mudah karena tidak perlu secara eksplisit menginstansiasi object, namun cara ini juga memungkinkan terjadinya kesalahan.
Dim frm2 As New Form2 Form2.Show()
Pada kode diatas object frm2 tidak digunakan padahal sudah dibuat karena user langsung mengakses default instance dari Form2. Untuk penggunaan implicit form anda disarankan menggunakan object My jadi kode menjadi lebih jelas karena anda akan mengetahui form tersebut sudah dibuat secara implicit. 88
My.Forms.Form2.Show()
Disarankan untuk menggunakan My object untuk memanggil default instance (cara implicit) pada aplikasi yang anda buat.
Method ShowDialog() juga akan menghentikan kode anda, kode akan diteruskan dibaca ketika user sudah menutup form modal.
89
Application Events
Pada kasus tertentu anda tidak hanya ingin menampilkan satu form saja ketika aplikasi dijalankan maka anda dapat menambahkan event handler pada aplikasi. Caranya klik tombol View Application Events di pojok kanan bawah Application Tab, ketika anda pertama kali mengklik tombol tersebut maka akan dicreate sebuah file dengan nama ApplicationEvents.vb. Daftar event pada application: Startup : dijalankan pertama kali pada saat aplikasi dibuat, tapi sebelum form startup dibuat. Jika anda ingin membuat form lain selain startup form ketika aplikasi pertama kali dijalankan anda dapat menaruhnya disini. Shutdown : dijalankan ketika semua form dalam aplikasi sudah ditutup, sebelum aplikasi berakhir. UnhandledException : dijalankan ketika aplikasi anda berakhir disebabkan oleh error. StartupNextInstance : dijalankan ketika aplikasi kedua dijalankan (ada 2 instance aplikasi yang dijalankan). Sebenarnya anda tidak perlu menggunakan event handler ini karena anda dapat memastikan bahwa satu instance aplikasi saja yang berjalan dengan cara check pada pilihan Make single instance application pada Application Tab. NetworkAvailabilityChanged : dijalankan jika ada koneksi jaringan yang terhubung atau putus. Even ini dijalankan jika aplikasi anda butuh terhubung ke Internet. Contoh penggunaan application event untuk menampilkan Splash Screen sebelum form startup dijalankan.
Partial Friend Class MyApplication Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e As Microsoft.VisualBasic. ApplicationServices.StartupEventArgs) Handles Me.Startup My.Forms.MySplashScreen.Show()
90
'kode untuk mmbuat delay waktu My.Forms.MySplashScreen.Close() End Sub End Class
Opacity
Pada VB9 form juga memiliki property yang cukup unik yaitu Opacity dan TransparancyKey. Anda dapat membuat form menjadi transparan dengan mengatur property opacity, semakin sedikit prosentase opacity maka semakin transparan formnya.
Kode yang digenerate secara otomatis oleh Visual Studio ketika anda membuat form dan menambahkan control didalamnya disimpan pada file Form1.Designer.vb. Jadi kode yang kita buat dan kode yang digenerate terpisah, ini memudahkan kita untuk membaca kode. Jika anda mencermati kode pada file designer.
Friend WithEvents btnForm2 As System.Windows.Forms.Button Private components As System.ComponentModel.IContainer <System.Diagnostics.DebuggerStepThrough()> _ Private Sub InitializeComponent() Me.btnForm2 = New System.Windows.Forms.Button Me.SuspendLayout() ' 'btnForm2 ' Me.btnForm2.Location = _ New System.Drawing.Point(12, 12) Me.btnForm2.Name = "btnForm2" Me.btnForm2.Size = New System.Drawing.Size(94, 23) Me.btnForm2.TabIndex = 0 Me.btnForm2.Text = "Panggil Form2" Me.btnForm2.UseVisualStyleBackColor = True ' 'Form1 ' Me.AutoScaleDimensions = _
92
New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = _ System.Windows.Forms.AutoScaleMode.Font Me.ClientSize = New System.Drawing.Size(284, 262) Me.Controls.Add(Me.btnForm2) Me.Name = "Form1" Me.Text = "Form1" Me.ResumeLayout(False) End Sub
Dari kode diatas kita dapat menyimpulkan bahwa: Setiap control didefinisikan sebagai variable di form. Access modifier yang digunakan adalah Friend agar control tersebut dapat diakses dari form lain dalam satu assembly (satu project). Semua control pada form terdapat pada method InitializeComponent() yang dipanggil secara otomatis ketika form tersebut di load. Inisialisasi properti pada setiap form dipisahkan pada blok yang berbeda (ada keterangan nama form dalam bentuk comment). Kode Me.Controls.Add(Me.btnForm2) digunakan untuk menambahkan control kedalam form.
Binary File
Binary file seperti file image akan disimpan kedalam folder resources ketika anda menggunakan PicturBox atau ImageList. VB9 akan menyimpan informasi untuk membaca file tersebut didalam file .resx (lain dengan VB6 yang menyimpan informasi resource pada file .frx).
membuat diagram yang otomatis di create ketika aplikasi dijalankan. Pada contoh dibawah ini kita akan membuat label control secara runtime ketika tombol btnProses diklik.
Private Sub btnProses_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProses.Click Dim lblHello As New System.Windows.Forms.Label lblHello.Location = New System.Drawing.Point(50, 50) lblHello.Name = "lblHello" lblHello.Size = New System.Drawing.Size(150, 30) lblHello.Text = "Hello VB !!" Controls.Add(lblHello) End Sub
Pada kode diatas kita menambahkan lblHello secara runtime kedalam form dengan menggunakan method Controls.Add(). Karena lblHello berapada di dalam subrutin maka tidak dapat diakses dari luar subrutin btnPoses_Click, untuk mengakses control lblHello dari button lain anda dapat menggunakan cara:
Me.Controls("lblHello").Text
2. Tambahkan method CreateRandom yang digunakan untuk menggenerate nilai randon dari 1 sd 10.
Private Sub CreateRandom(ByVal sender As Object, ByVal e As EventArgs) Dim rndNumber As New Random 'generate nilai random dari 1-10 MessageBox.Show(rndNumber.Next(10) + 1) End Sub
3. Pada event Form1_Load tambahkan kode berikut untuk meregister method CreateRandom sebaga event pada btnRandom1.
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim btnRandom1 As New Button btnRandom1.Location = New System.Drawing.Point(50, 50) btnRandom1.Size = New System.Drawing.Size(100, 30) btnRandom1.Name = "btnRandom1" btnRandom1.Text = "Random 1" Controls.Add(btnRandom1) meregister method menjadi event handler AddHandler btnRandom1.Click, AddressOf CreateRandom End Sub
4. Jika program dijalankan maka otomatis akan di create tombol btnRandom1, dan ketika di klik maka akan dijalankan method CreateRandom yang sudah didaftarkan menjadi event handler.
95
2. Pada Form1 tambahkan sebuah ComboBox dengan nama cmbHobi, tambahkan pula sebuah button dengan nama btnForm2, ubah properti Text=Panggil Form2. 3. Kemudian tambahkan sebuah form dengan nama Form2 isi dengan dua control yaitu textbox dengan nama txtHobi dan sebuah button dengan nama btnTambah, atur properti Text = Tambah. 4. Double click pada btnForm2 di Form1 kemudian tambahkan kode berikut:
Private Sub btnForm2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnForm2.Click My.Forms.Form2.Show() End Sub
6. Jika anda menambahkan hobi di Form2 maka nilainya akan dimasukan kedalam combobox yang ada di Form1, jadi interaksi antar control yang berada di form yang berbeda cukup mudah karena setiap form sudah otomatis dibuatkan instancenya (implicit), dan control di 96
dalam form tersebut access modifiernya Friend jadi bisa diakses dari form lain yang ada dalam satu project.
Jawaban dari user akan berupa object DialogResult (bisa OK atau Cancel). Sangat mudah menggunakan MessageBox untuk menampilkan form konfirmasi ke user, namun bagaimana caranya jika anda ingin menggunakan Form biasa untuk mengembalikan result dari user?. Misal selain tombol OK dan Cancel anda juga ingin menampilkan Label atau ListBox yang berisi informasi tertentu, anda tidak bisa menggunakan MessageBox untuk keperluan seperti ini. Untuk menggunakan form yang dapat mengembalikan result seperti MessageBox anda bisa mengatur properti DialogResult pada tombol. Misal anda mempunyai form yang berisi ListBox, dan dua tombol btnOk dan btnCancel. Atur 97
Owned Forms
.NET Framewok mempunyai konsep owned forms. Owned form adalah form yang dimiliki oleh form lain, jika form pemilik diminimize maka semua form yang dimilikinya juga akan di minimize. Form yang dimiliki (owned form) juga selalu ditampilkan diatas form pemilik (owner). Biasanya owned form digunakan untuk membuat floating toolbox dan command windows (missal form find dan replace windows di MS Word). Cara untuk mengantur sebuah form menjadi owned form adalah:
My.Forms.SearchForm.Owner = Me My.Forms.ReplaceForm.Owner = Me My.Forms.SearchForm.Show()
MDI Form
MDI (Multiple Document Interface) program adalah program yang berbasikan Form tunggal yang mempunyai banyak form anak. Penggunaan model MDI ditujukan agar user dapat menggunakan banyak form secara bersamaan (report, grid,list, dll). Setiap Form dapat menjadi container MDI dengan cara mengatur properti IsMdiContainer menjadi true. Untuk membuat sebuah form sebagai anggota dari form container 98
anda dapat mengatur properti MdiParent (mirip seperti pengaturan pada owned form).
Me.IsMdiContainer = True My.Forms.Form2.MdiParent = Me My.Forms.Form3.MdiParent = Me My.Forms.Form2.Show() My.Forms.Form3.Show()
Kode diatas ditulis di form yang bertindak sebagai form container, pada kode tersebut form yang akan digunakan sebagai child didaftarkan terlebih dahulu dengan mengatur properti MdiParent.
ToolStrip : untuk meletakan toolbar control. MenuStrip : untuk membuat menu windows. ContextMenuStrip : digunakan untuk menampilkan popup menu jika user melakukan klik kanan pada control. StatusStrip : digunakan untuk menampilkan status bar. Status bar mirip dengan ToolStrip hanya saja tidak menampilkan tombol melainkan text. ToolStripContainer : digunakan untuk menaruh beberapa ToolStrip yang dapat di atur letaknya.
Provider
Provider adalah tipe komponen yang unik, provider menambahkan properti pada control lain dalam form. Misalnya jika anda menambahkan ToolTipProvider ke component try maka secara otomatis properti dengan nama ToolTip akan muncul pada properti control yang lain pada form tersebut (misal pada button, textbox). Ada beberapa provider yang lain di VB9 yaitu: HelpProvider: provider ini digunakan untuk menampilkan pesan help atau menampilkan windows help. Anda dapat menggunakan tombol F1 untuk menampilkan help. 100
ErrorProvider: provider ini digunakan untuk menampilkan error pada control tertentu, misalnya pada TextBox ketika kosong, atau inputan yang dimasukan oleh user tidak sesuai.
VB9 data types seperti array, string, dan bahkan integer adalah object, pada chapter sebelumnya kita bekerja dengan menggunakan Form yang juga object. Untuk bekerja dengan object secara maksimal menggunakan VB9 anda harus mengerti secara benar konsep object oriented programming.
aspek esensial yang ada. Jika model yang dikembangkan semakin mendekati problem yang akan dipecahkan maka semakin mudah pula persoalan tersebut dapat dimengerti sehingga program lebih mudah ditulis dan di-maintain.
Types
Jika kita cermati .NET class library terdiri dari beberapa type yaitu: Structure : adalah kumpulan data types, structure membungkus beberapa variable menjadi satu package. Perbedaan yang mendasar antara structure dan class adalah stucture merupakan value type sedangkan class merupakan reference type. Classes : class mirip dengan structure tapi lebih advanced, terdiri dari fields (class variable), method (sub dan function), properties, dan event. Delegates : delegate mendefinisikan signature dari method, dengan menggunakan delegate anda dapat mereferensi variable untuk mereferensi ke method tertentu. Enumeration : Enumeration adalah kumpulan konstanta. Enumeration memudahkan programmer untuk bekerja dengan banyak pilihan nilai. Interfaces : interface adalah kontrak berisi properti atau method yang nantinya harus dimiliki oleh class yang mengimplementasikan interface tersebut.
Structure
Sebelum muncul class dalam OOP maka ide pertama adalah membuat structure. Structure digunakan untuk melakukan grouping data (beberapa variable) secara bersama. Misalnya anda ingin menyimpan informasi tentang data mahasiswa anda dapat membuat beberapa variable seperti 103
nim, nama, alamat, ipk, dan nohp, namun jika anda membuat menjadi variable yang berdiri sendiri-sendiri maka kode anda akan menjadi semakin kompleks, dan kita tidak bisa tahu bahwa variable-varible tersebut punya hubungan. Jika anda ingin menyimpan data beberapa mahasiswa maka ini akan sangat sulit dilakukan untuk melacak hubungan informasi antar mahasiswa. Untuk menjadikan informasi yang ada menjadi satu group anda dapat menggunakan structure.
Public Structure Mahasiswa Dim nim As String Dim nama As String Dim ipk As Double Dim nohp As String End Structure
Pada VB9 anda dapat menggunakan structure pada file atau module level. Anda dapat menggunakan structure yang anda buat diatas dengan cara:
Dim mhs1 As Mahasiswa mhs1.nim = "23080008" mhs1.nama = "Erick Kurniawan" mhs1.ipk = 3.5 mhs1.nohp = "08156881169"
Kode diatas mudah untuk dibaca, ketika anda hendak mengubah nilai dari variable anda juga mengetahui mahasiswa mana yang informasinya akan diubah. Anda juga dapat melakukan parsing semua informasi mahasiswa dengan menggunakan structure dari subroutines atau function yang anda buat.
Function GetMhs(ByVal mhs1 As Mahasiswa) 'code disini.. End Function
Structure memiliki konsep yang sama seperti pada database, di database anda biasa membuat table, dan table terdiri dari field-field yang membentuk sebuah record. Structure dapat diibiratkan seperti record dalam table yang berisi variable (field-field) yang menyusun informasi tertentu. 104
Class
Bagaimana membuat structure yang anda buat menjadi lebih smart? Misalnya structure mahasiswa tidak mengijinkan panjang dari nim lebih dari 8 karakter, dapat memberi informasi lengkap dari mahasiswa, dan dapat memberi peringatan jika ip sudah dibawah 2.0. Untuk keperluan diatas anda harus menggunakan Class. Structure dan class memiliki kesamaan yaitu dapat menyimpan informasi, namun class memiliki banyak fitur yang tidak dimiliki oleh structure. Untuk menambahkan class pada project, klik kanan project pilih add new item pilih class kemudian beri nama class-nya. Jika kode structure yang sebelumnya diubah menjadi class maka kodenya:
Public Class Mahasiswa 'data mahasiswa Public nim As String Public nama As String Public ipk As Double Public nohp As String 'fitur untuk menampilkan data mahasiswa Public Function GetMhsInfo() As String Return "Nim : " & nim & " Nama : " & nama & _ " Ipk : " & ipk End Function End Class
Jika anda cermati kode diatas mirip dengan kode untuk membuat structure, perbedaannya terletak pada keyword public yang digunakan pada variable. Sebenarnya secara default modifier dari variable yang ada di dalam class adalah private (tidak dapat diakses dari luar class) tapi karena kita menghendaki variable tersebut dapat diakses maka dibuat public. Class Mahasiswa juga mempunyai tambahan method dengan nama GetMhsInfo() untuk menampilkan informasi dari mahasiswa. 105
Instansiasi Object
Untuk menggunakan class Mahasiswa yang telah kita buat sebelumnya, anda harus membuat object dari class tersebut (instansiasi).
'beberapa cara untuk instansiasi class Dim mhs1 As Mahasiswa = New Mahasiswa() Dim mhs2 As New Mahasiswa
Pada VB9 anda dapat membuat class dengan cara yang berbeda, yang pertama anda dapat mendelkarasikan variable dengan tipe class terlebih dahulu baru membuat object, dan cara kedua digunakan jika anda ingin mendeklarasikan variable sekaligus membuat object. Keyword New wajib digunakan jika anda ingin membuat object baru. Anda tidak perlu menggunakan keyword set seperti pada VB6. Setelah object dibuat anda dapat memberi nilai fileds (class variable nya).
mhs1.nim = "23080009" mhs1.nama = "Erick Kurniawan" mhs1.ipk = 3.5 mhs1.nohp = "08156881169" MessageBox.Show(mhs1.GetMhsInfo(), "Keterangan")
Untuk release object (variable tidak lagi mereferensi ke object) anda dapat menggunakan keyword Nothing.
mhs1=Nothing
Penggunaan keyword Nothing memberi tahu pada compiler VB bahwa object tersebut sudah tidak dibutuhkan lagi. Sebenarnya compiler akan segera membersihkan object tersebut secara otomatis ketika keluar dari kalang program (out of scope), misal diakhir kalang subrutin object tersebut akan dibersihkan, jika anda ingin membersihkan object sebelum out of scope anda dapat menggunakan keyword Nothing.
106
Mengkopi Object
Jika anda ingin mengcopy nilai seperti anda biasa lakukan di tipe data biasa (integer, double) maka anda tidak akan mendapatkan hasil yang anda harapkan, misal:
Dim mhs1 As New Mahasiswa Dim mhs2 As New Mahasiswa mhs1.nama = "Erick" 'mhs2 akan mereferensi ke object yang sama dengan mhs1, 'object dari mhs2 tidak digunakan mhs2 = mhs1
Statement terakhir mhs2 = mhs1 artinya mhs2 sekarang mereferensi ke object yang sama dengan mhs1, bukan nilai dari mhs1 dicopykan ke mhs2. Sedangkan object asli dari mhs2 sudah tidak direferensi lagi.
'akan menghasilkan erick MessageBox.Show(mhs2.nama)
Biarpun kode diatas sepertinya benar, bahwa mhs2.nama menghasilkan Erick, namun nilai Erick tidak dicopy ke variable mhs2.
mhs2.nama = "Rully" MessageBox.Show(mhs1.nama)
Jika anda mengganti fields pada object mhs2 maka nilai fields pada mhs1 juga otomatis berubah, karena mhs1 dan mhs2 mereferensi ke object yang sama (tidak hanya mengcopy nilai masing-masing). 107
Jika anda ingin mengcopy object beserta dengan valuenya, atau ingin membuat object baru yang persis sama beserta valuenya, tidak hanya mereferensi ke object yang sama, maka anda dapat menggunakan method clone(). Method ini disupport oleh sebagian class yang ada di .NET contohnya Array.
Dim arrNama1() As String = {"erick", "rully", "naren"} Dim arrNama2() As String = arrNama1.Clone() 'jika elemen arrNama2 diganti arrNama2(0) = "bejo" 'tidak berpengaruh pada arrNama1 karena referensi 'objectnya berbeda MessageBox.Show(arrNama1(0))
Membandingkan Object
Tipe reference juga punya aturan tersendiri untuk membandingkan object, anda tidak dapat menggunakan tanda = untuk operator pembanding antar object. Untuk membandingkan dua variable mereferensi ke object yang sama atau tidak anda dapat menggunakan keyword Is atau IsNot.
Dim mhs1 As New Mahasiswa Dim mhs2 As New Mahasiswa mhs1.nama = "Erick" mhs2.nama = "Erick" 'menghasilkan false karena tidak mereferensi ke object yg 'sama MessageBox.Show(mhs1 Is mhs2) mhs2 = mhs1 'menghasilkan true karena mereferensike object yang sama MessageBox.Show(mhs1 Is mhs2)
108
Biarpun fields pada object mhs1 dan object mhs2 sama namun mhs1 tidak sama dengan mhs2 karena keduanya mereferensi ke object yang berbeda.
Partial Class
Seperti yang sudah anda ketahui bahwa anda dapat membuat beberapa class sekaligus di dalam file .vb, dan nama file tidak harus sama dengan nama classnya. VB9 juga memiliki fitur untuk memecah penulisan class pada beberapa file yang berbeda menggunakan method Partial. Partial class akan sangat berguna jika anda bekerja dengan class yang sangat besar. Misal anda dapat membuat class Mahasiswa yang disimpan dalam file Mahasiswa1.vb.
Partial Public Class Mahasiswa Public nim As String Private nama As String Private ipk As Double End Class
Kemudian anda dapat menambahkan bagian dari class diatas pada file lain misalnya Mahasiswa2.vb
Partial Public Class Mahasiswa Public Function GetMhsInfo() As String Return "Nim : " & nim & " Nama : " & nama & _ " Ipk : " & ipk.ToString End Function End Class
109
Biarpun class Mahasiswa terpisah di dua file tapi compiler tetap tahu kedua file tersebut satu kesatuan class.
Class Properties
Sepeti kita ketahui class terdiri dari class member yaitu : Fields (class variable) Properti (untuk mengakses private fields) Method (sub dan function) Event Fields pada class Mahasiswa yang kita buat sebelumnya memiliki access modifier Public yang berarti fields tersebut dapat diakses oleh class lain secara bebas. Memang membuat class menjadi Public memudahkan anda untuk bekerja dengan fields namun cara ini juga membahayakan karena kita tidak dapat memastikan bahwa value yang dimasukan kedalam fields adalah value yang benar (yang kita harapkan). Misal kita mengharapkan fields nim ari class Mahasiswa diisi dengan format yang benar, terdiri dari 8 karakter. Jika anda menggunakan public fields anda tidak dapat memvalidasi apakah inputan fields benar. Karena alasan diatas maka anda disarankan membuat fields dengan access modifier private kemudian untuk mengakses fields tersebut dari luar class anda dapat membuat properti. Properti digunakan untuk mengenkapsulasi logika program yang kita buat untuk memvalidasi inputan yang masuk ke fields. Property terdiri dari method get dan set, method get digunakan untuk mengambil nilai dari private fields, sedangkan method set digunakan untuk memberi nilai kedalam private fields.
Public Class Mahasiswa 'private fields Private _nim As String 'untuk mengakses private fields diatas gunakan property Public Property Nim() As String Get
110
Return _nim End Get Set(ByVal value As String) _nim = value End Set End Property End Class
membuat
property
cara
untuk
Anda mungkin bertanya jika menuliskan kode seperti diatas apa bedanya jika anda menggunakan Public fields. Bedanya dengan menggunakan property maka anda dapat memastikan bahwa inputan ke fields benar. Anda dapat menambahkan kode validasi (misal: panjang dari nim harus 8 karakter). Untuk menambahkan validasi tambahkan kode berikut pada property.
Private _nim As String Public Property Nim() As String Get Return _nim End Get Set(ByVal value As String) If value.Length <> 8 Then MessageBox.Show("Panjang nim harus 8 karakter") Else _nim = value End If End Set End Property
Anda dapat menambahkan kode untuk validasi di dalam method set pada property, sehingga sebelum nilai masuk dalam private fields terlebih dahulu harus dipastikan bahwa nilai yang diinputkan valid. 111
ReadOnly Property ReadOnly property digunakan jika anda hanya mengijinkan private field hanya dibaca saja, tidak untuk diberi nilai. Misal untuk field Ipk tidak dapat diganti nilainya, hanya dapat diambil nilainya.
Private _ipk As Double Public ReadOnly Property Ipk() As Double Get Return _ipk End Get End Property
Constructor
Constructor pada VB9 adalah method dengan nama New yang digunakan untuk menginisialisasi (memberi nilai) awal fields pada saat class tersebut di instansiasi.
Public Class Mahasiswa Private nim As String Private nama As String Private ipk As Double 'constructor yang digunakan untuk inisialisasi awal Public Sub New() nim = "23080007" nama = "Erick Kurniawan" End Sub Public Function GetInfo() As String Return "Nim : " & nim & " Nama : " & nama End Function End Class
Ketika anda membuat object baru dari class Mahasiswa maka field nim dan nama akan otomatis diinisialisasi dengan nilai yang anda definisikan di constructor.
'field otomatis diberi nilai oleh constructor Dim mhs1 As New Mahasiswa
112
MessageBox.Show(mhs1.GetInfo())
Constructor Berparameter Constructor juga dapat memiliki parameter, contoh constructor berparameter dapat dilihat pada kode dibawah ini:
Public Sub New(ByVal nim As String, ByVal nama As String, ByVal ipk As Double) Me.nim = nim Me.nama = nama Me.ipk = ipk End Sub
Jika anda menggunakan constructor berparameter maka cara membuat instan class (object):
Dim mhs2 As New Mahasiswa("23080007", "Erick Kurniawan", _ 3.5) MessageBox.Show(mhs1.GetInfo()
Overloading Constructor VB9 juga mendukung penggunaan Multiple Constructor, anda dapat membuat lebih dari satu constructor (overloading constructor). Untuk membuat lebih dari satu constructor syaratnya adalah parameter dari constructor tipe datanya harus berbeda atau jumlah parameternya berbeda.
'contoh overloading constructor Public Sub New() nim = "23080007" nama = "Erick Kurniawan" End Sub Public Sub New(ByVal nim As String) Me.nim = nim End Sub
113
Public Sub New(ByVal ipk As Double) Me.nama = nama End Sub Public Sub New(ByVal nim As String, _ ByVal nama As String, ByVal ipk As Double) Me.nim = nim Me.nama = nama Me.ipk = ipk End Sub
Default Constructor Jika anda tidak membuat constructor maka class secara implicit secara otomatis sudah membuat constructor kosong.
'default constructor Public Sub New() 'inisialisasi field End Sub
Destructor Pada .NET anda tidak perlu lagi membuat destructor ketika object tersebut sudah tidak lagi dibutuhkan. Object yang sudah tidak digunakan atau out of scope akan secara otomatis dibersihkan oleh Garbage Collection. Garbage Collection adalah salah satu komponen yang ada di CLR (Common Language Runtime) .NET yang bertugas untuk membersihkan object yang sudah tidak digunakan. Akhir Object VB6 Pada VB6 jika anda sudah tidak membutuhkan object maka anda dapat menggunakan keyword set dan diberi nilai Nothing. Karena object dapat direferensi oleh beberapa variable, maka semua variable harus di set Nothing sampai 114
variable terakhir yang mereferensi object tersebut. Jika sudah tidak ada yg mereferensi maka otomatis object tersebut akan dihapus dari memory. Metode ini dinamakan deterministic finalization karena anda harus tahu kapan object tersebut dihapus. Akhir Object VB9 Pada VB9 programmer menjadi lebih mudah karena tidak perlu menghapus object secara manual karena ketika object tersebut sudah tidak diperlukan atau out of scope secara otomatis Garbage Collection akan membersihkannya. Metode ini disebut non deterministic finalization. Kelemahannya anda tidak tahu pasti kapan object tersebut dihapus karena tergantung pada Garbage Collection. Anda sebenarnya dapat memanggil GC secara langsung dengan perintah.
GC.Collect()
Namun cara ini tidak disarankan karena akan memperlambat program, karena GC akan menscan semua memory dan memeriksa object yang sudah tidak digunakan. Cara yang disarankan digunakan untuk membuat program anda menjadi lebih efektif adalah dengan membuat sendiri destruktor pada class yang anda buat yaitu menggunakan method Dispose(). Umumnya class tidak memerlukan Dispose() method, tapi untuk kasus tertentu ada juga yang membutuhkan Dispose(). Misalnya class yang digunakan untuk koneksi dengan database atau file yang harus melepaskan resource secepat mungkin (koneksi dengan database harus ditutup secepat mungkin jika anda sudah tidak memerlukannya karena resource nya dibagi banyak user). Untuk menggunakan method Dispose() ana harus mengimplementasikan Interface IDisposable.
115
Events
Salah satu bagian dari class adalah event. Event adalah notifikasi yang dikirimkan sebuah object ke object yang lain. Anda dapat mendeklarasikan event di class dengan keyword event.
Public Class Mahasiswa Private nim As String Private ipk As String 'deklarasi event Public Event UbahData() End Class
Event UbahData() pada kod diatas akan digunakan untuk memberi notifikasi ketika data mahasiswa diubah. Anda dapat memanggil event yang sudah dideklarasikan menggunakan keyword RaiseEvent. Listing 5.1 Penggunaan Events 1. Buat windows application dengan nama LatihanEvent 2. Design tampilan windows sebagai berikut:
Gambar 5.1
116
Get Return _nim End Get Set(ByVal value As String) _nim = value End Set End Property Private _nama As String Public Property Nama() As String Get Return _nama End Get Set(ByVal value As String) _nama = value RaiseEvent UbahData() End Set End Property Public Sub New(ByVal nim As String, _ ByVal nama As String) Me.Nim = nim Me.Nama = nama End Sub End Class
117
System.Object, ByVal e As System.EventArgs) Handles btnUbahNama.Click mhs.Nama = txtUbahNama.Text End Sub End Class
Pada class Mahasiswa kita sudah mendeklarasikan event dengan nama UbahData() dan event tersebut dipanggil ketika data pada filed nama diubah. Kemudian pada form kita membuat object mhs dengan keyword WithEvent yang berarti object tersebut menggunakan event. Kita juga mendeklarasikan method dengan nama RefreshData() dengan menggunakan keyword handle, ini berarti method tersebut akan dipanggil ketika event UbahData() dijalankan (dengan keyword RaiseEvent) pada saat field nama pada object mhs diubah. Method RefreshData() akan mengupdate tampilan textbox nim dan nama pada form.
Enumeration
Enumeration adalah sebuah type yang terdiri dari kumpulan konstanta. Enumeration dibuat untuk menyelesaikan beberapa persoalan, misal ada kasus anda membuat method untuk pengecekan jurusan yang diambil oleh mahasiswa.
Function CekJurusan(ByVal jurusan As String) As String Dim kode As String = "" If jurusan = "TI" Then 'tulis kode disini ElseIf jurusan = "SI" Then 'tulis kode disini ElseIf jurusan = "Manajemen" Then 'tulis kode disini End If Return kode End Function
Beberapa masalah yang akan ditemui dari kode yang kita buat diatas. 118
Pertama kita tidak dapat memastikan bahwa nilai dari parameter yang diinputkan benar (sesuai dengan yang diharapkan) Pengguna method akan bingung karena tidak tahu pasti data apa yang harus dimasukan kedalam parameter.
Kode lebih sulit untuk dimengerti. Cara penulisan kode tidak standar karena mungkin ada programmer lain yang membuat method lain untuk menyelesaikan masalah yang sama. Tidak ada bantuan intellisense pada Visual Studio untuk mengisi nilainya sehingga kesalahan sangat mungkin terjadi. Dalam kasus seperti diatas penggunaan Enumeration lebih disarankan. Dengan menggunakan enumeration maka kode diatas dapat diubah menjadi.
Public Enum TipeJurusan TI SI Manajemen Akuntansi End Enum Function CekJurusan(ByVal jurusan As TipeJurusan) As String Dim kode As String = "" If jurusan = TipeJurusan.TI Then kode = "22" ElseIf jurusan = TipeJurusan.SI Then kode = "21" ElseIf jurusan = TipeJurusan.Manajemen Then kode = "11" ElseIf jurusan = TipeJurusan.Akuntansi Then kode = "12" End If Return kode End Function
119
Dengan enumeration masalah-masalah diatas dapat diatasi dan penggunaan method akan menjadi lebih mudah karena nilai parameternya sudah pasti.
Dim kode As String = CekJurusan(TipeJurusan.SI)
Shared Member
Pada Bab3 kita telah membahas bahwa class dapat memiliki shared member yaitu member yang dapat diakses tanpa anda harus membuat instan class dari class tersebut.
Shared Method
Jika anda mendeklarasikan method dengan keyword shared, maka anda akan dapat mengakses method tersebut langsung dari class tanpa harus membuat instan class terlebih dahulu. Ini sama dengan class bawaan dari .NET yang sering anda gunakan yaitu class Math, class MessageBox, dan class Console.
Dim hasil = Math.Sqrt(81)
Penggunaan keyword shared berarti shared method akan di share ke semua instance dari class tersebut dan selalu dapat diakses.
Public Class Mahasiswa Public Shared Function CekLulus(ByVal nilai As Double) As Boolean Return If(nilai >= 70, True, False) End Function End Class 'mengakses shared method pada class Mahasiswa Dim cek = Mahasiswa.CekLulus(85) MessageBox.Show(cek)
Jika anda membuat shared method, anda tidak boleh menggunakan instance member (yang tidak menggunakan keyword shared) pada method yang anda buat.
Public Shared Function CekLulus() As Boolean
120
'error karena tidak dapat mengakses ipk Return If(ipk >= 70, True, False) End Function
Shared Properties
Sama seperti ketika anda membuat shared method, anda juga dapat membuat shared variable dan properties dengan menambahkan keywoed shared.
Public Class Mahasiswa Private Shared _count As Integer Public Shared Property Count() As Integer Get Return _count End Get Set(ByVal value As Integer) _count = value End Set End Property Public Sub New() _count += 1 End Sub End Class
Pada kode diatas dapat dilihat bahwa setiap anda membuat object baru maka fields _count akan ditambah satu, anda dapat mengakses properties Count untuk mengetahui jumlah object Mahasiswa yang di create.
Dim mhs1 As New Mahasiswa Dim mhs2 As New Mahasiswa 'menghasilkan 2 karena ada 2 object yang dibuat MessageBox.Show(Mahasiswa.Count.ToString)
Menggunakan Module
Pada VB, class bukanlah satu-satunya tempat untuk menuliskan kode, anda dapat juga menuliskan kode anda di 121
dalam module. Modul biasanya digunakan untuk membuat helper method (method yang sering digunakan di beberapa tempat pada aplikasi anda). Bagi kebanyak programmer VB module cara untuk melakukan reuse pada kode. Fungsi modul hampir mirip dengan shared method yang baru saja kita pelajari. Module adalah cara yang paling simple untuk sharing function pada aplikasi.
Module MyModule Function Tambah(ByVal bil1 As Integer, ByVal bil2 As Integer) As Integer Return bil1 + bil2 End Function Function Kurang(ByVal bil1 As Integer, ByVal bil2 As Integer) As Integer Return bil1 - bil2 End Function End Module 'cara untuk memanggil module Dim hasil As Integer = MyModule.Tambah(12, 23)
122
Prinsip-prinsip OOP
Untuk berubah dari paradigma traditional menjadi Object Oriented Programming tidak mudah karena banyak perbedaan yang signifikan. OOP mempunyai prinsip dan aturan yang harus diikuti untuk dapat membangun program yang reusable, efisien, dan dapat dimanage dengan mudah. Beberapa prinsip OOP adalah:
Gambar diatas menunjukan relasi antara window, button, dan listbox. Button dan listbox sama-sama memiliki karakteristik yang dimiliki oleh window, tetapi button dan listbox juga memiliki ciri-ciri spesifik khas mereka sendiri.
Inheritance
Inheritance merupakan fitur OOP baru yang tidak ada di VB6. Dengan menggunakan Inheritance anda dapat membuat 124
class baru (derived class) dari class yang sudah ada (base class). Derived class akan mempunyai behaviour (field, method, properties) dari base class dan ditambah dengan behaviour miliknya sendiri. Inheritance juga merupakan penerapan konsep spesialisasi pada OOP. Kegunaan dari Inheritance yang terutama adalah untuk code reuse (penggunaan kode kembali). Misal pada .NET anda sudah mempunyai class button, namun anda tidak puas karena tidak ada properti shape yang dapat digunakan untuk merubah bentuk button menjadi menarik, maka anda dapat membuat class baru yang diturunkan dari class button yang sudah ada, kemudian ditambahkan dengan properti shape. Jadi anda tidak perlu membuat class button lagi dari awal karena kita sudah mempunyai class button yang lama yang dapat di reuse. Jika anda menggunakan aplikasi windows maka form yang anda buat pasti diturunkan dari class System.Windows.Forms.Form. Anda juga harus menambahkan referensi class library yang diperlukan. Penerapan Inheritance di VB menggunakan keyword Inherits. Contoh penggunaan Inheritance secara sederhana ditunjukan pada contoh dibawah ini. Pertama kita membuat sebuah class dengan nama MyControl yang akan kita jadikan sebagai base class.
Public Class MyControl Private left As Integer Private top As Integer 'Constructor Public Sub New(ByVal left As Integer, ByVal top As Integer) Me.left = left Me.top = top End Sub Public Function GambarMyControl() As String Return String.Format("Menggambar MyControl pada posisi ({0},{1})",left, top) End Function
125
End Class
Clas diatas mempunyai dua buah private fields, sebuah constructor dan sebuah function. Sekarang kita akan membuat derived class dari class tersebut. Untuk menurunkan class gunakan keyword Inherits.
Class MyListBox Inherits MyControl Private content As String Public Sub New(ByVal left As Integer, ByVal top As Integer, ByVal content As String) 'menjalankan constructor milik base class MyBase.New(left, top) Me.content = content End Sub Public Function GambarMyListBox() As String 'menjalankan method milik base class Return MyBase.GambarMyControl() & " dan isi content : " & content End Function End Class
Class MyListBox diturunkan dari class MyControl jadi class MyListBox juga memiliki behaviour (field, properties, method) dari base class-nya. Hanya saja field left dan top tidak dapat diakses karena access modifiernya private jadi hanya dapat diakses dari class itu sendiri, tidak bisa diakses dari class trurunannya. Class MyListBox juga harus memiliki constructor karena MyControl yang menjadi base class-nya hanya memiliki sebuah constructor berparameter (tidak punya constructor kosong). Jadi constructor di MyListBox juga harus memanggil constructor di MyControl untuk menginisialisasi field left dan top. Untuk memanggil base constructor (constructor dari MyControl) digunakan keyword MyBase.New(). MyBase digunakan untuk mengakses method atau properties dari base 126
class, misal untuk menggunakan method GambarMyControl() penulisannya MyBase.GambarMyControl(). Tambahkan sebuah class lagi dengan nama Button yang juga diturunkan dari MyControl.
Class MyButton Inherits MyControl Private warna As String Public Sub New(ByVal left As Integer, ByVal top As Integer, ByVal warna As String) MyBase.New(left, top) Me.warna = warna End Sub Public Function GambarMyButton() As String Return MyBase.GambarMyControl & " dan warnanya : " & warna End Function End Class
Kemudian terakhir buat object dari class-class yang sudah anda buat.
Dim objControl As New MyControl(12, 12) MessageBox.Show(objControl.GambarMyControl()) Dim objListBox As New MyListBox(24, 24, "ListBox Content") MessageBox.Show(objListBox.GambarMyListBox()) Dim objButton As New MyButton(88, 88, "merah") MessageBox.Show(objButton.GambarMyButton())
Protected Modifier
Pada kode diatas kita tidak dapat mengakses field left dan top dari class MyControl dari class turunannya karena access modifiernya private, jika anda ingin agar kedua field tersebut dapat diakses dari class turunannya namun juga tidak dapat diakses dari instan classnya maka anda dapat menggunakan access modifier protected pada field left dan top. Sebagai 127
contoh coba ubah access modifier dari field top dan left pada class MyControl dengan keyword Protected.
Public Class MyControl Protected left As Integer Protected top As Integer ---------End Class
Seperti anda lihat pada kode diatas, kita bisa mengakses field left dan top dari class MyControl secara langsung pada class MyListBox. Ini dapat terjadi karena access modifier field di case class adalah protected.
Polymoprhism
Ada dua aspek yang paling penting pada inheritance yang pertama adalah code reuse, sebagai contoh ketika anda membuat class ListBox maka anda dapat menggunakan logic yang sudah dibuat pada class Window Aspek kedua yang tidak kalah penting dari inheritance adalah polymorhism, poly berarti banyak dan morph berarti bentuk, jadi polymorphism dapat berarti dapat menggunakan banyak bentuk tanpa harus mengacu details yang sama. Dari istilahnya Polymorphism kesannya sulit dan kompleks, tetapi sebenarnya simple, ilustrasinya begini ketika sebuah perusahaan telpon atau provide telpon mengirimkan signal ke anda (dering telpon), mereka tidak tahu telpon apa yang anda gunakan, bisa model lama dengan dering kuno, bisa 128
HP dengan dering music mp3, TV Phone, PDA Phone dll. yang provider tahu bahwa masing-masing telepon mempunyai base type telepon dan mempunyai method untuk berdering. Ketika provider mengirimkan signal mereka hanya berharap bahwa telepon akan berdering tidak peduli jenis telponnya, nah provider telepon memperlakukan telepon anda secara polymorphism. Dari gambar 6.1 diatas dapat anda lihat, ListBox is-a Window (karena ListBox turunan dari Window), Button is-a Window, kita berharap bahwa dapat memperlakukan keduanya sebagai Window. Sama juga dengan kucing dan sapi yang diturunkan dari class Mamalia, anda dapat mengatakan bahwa kucing dan sapi sama-sama Mamalia. Misal anda mempunyai banyak control di collection untuk digambar ke windows, dan mengharapkan ketika memanggil method draw() pada control maka control2 tersebut akan tergambar sesuai dengan tipe objectnya (mis: ListBox, RadioButton, Command, dll). Anda dapat mengimplementasikan polymorphism dengan dua cara yaitu: Membuat method dengan keyword Overridable pada base class (class induk). Overridable method adalah method yang akan di override di class turunannya. Membuat class turunan yang mempunyai method dengan keyword overrides yang mengganti isi dari method dengan keyword virtual yang ada pada base class-nya. Method Overriding yaitu method dengan nama yang sama, tipe dan jumlah parameternya juga sama namun implementasinya berbeda, digunakan untuk mengoverride method yang ada pada base class. Penggunaan prinsip polymorphism dapat dilihat pada contoh program dibawah ini. Pertama buat class dengan nama MyControl yang akan digunakan sebagai base class.
Public Class MyControl Private _left As Integer Public Property Left() As Integer
129
Get Return _left End Get Set(ByVal value As Integer) _left = value End Set End Property Private _top As Integer Public Property Top() As Integer Get Return _top End Get Set(ByVal value As Integer) _top = value End Set End Property Public Sub New(ByVal left As Integer, ByVal top As Integer) Me.Left = left Me.Top = top End Sub Public Overridable Function DrawControl() As String Return String.Format("Menggambar Control pada posisi ({0},{1})", Left, Top) End Function End Class
130
_content = value End Set End Property Public Sub New(ByVal left As Integer, ByVal top As Integer, ByVal content As String) MyBase.New(left, top) Me.Content = content End Sub Public Overrides Function DrawControl() As String Return String.Format("Menggambar ListBox pada posisi({0},{1}) dan isi content: {2}", Left, Top, Content) End Function End Class Class MyButton Inherits MyControl Private _warna As String Public Property Warna() As String Get Return _warna End Get Set(ByVal value As String) _warna = value End Set End Property Public Sub New(ByVal left As Integer, ByVal top As Integer, ByVal warna As String) MyBase.New(left, top) Me.Warna = warna End Sub Public Overrides Function DrawControl() As String Return String.Format("Menggambar Button pada posisi ({0},{1}) dan warnanya {2}", Left, Top, Warna) End Function End Class
131
Pada kode diatas dapat dilihat bahwa method DrawControl() pada class MyControl di override oleh kedua class turunannya yaitu MyListBox dan MyButton. Maka kita dapat menerapkan Polymorphism, dengan cara:
Dim objControl As New MyControl(12, 12) Dim objListBox As New MyListBox(24, 24, "Content ListBox") Dim objButton As New MyButton(24, 24, "Merah") 'polymorphism MyListBox dan MyButton dianggap 'sebagai MyControl Dim arrControl(2) As MyControl arrControl(0) = objControl arrControl(1) = objListBox arrControl(2) = objButton For Each ctr In arrControl MessageBox.Show(ctr.DrawControl()) Next
Jika anda perhatika kode diatas dapat dilihat adalah arrControl adalah variable bertipe array dari MyControl. Maka seharusnya yang dapat dimasukan kedalam array tersebut adalah object dari class MyControl, namun dalam kasus diatas objListBox dan objButton juga dapat dimasukan kedalam arrControl padahal dua object tersebut bukan dari class MyControl. Kenapa bisa begitu? Ini terjadi karena konsep polymorphism, class MyListBox dan MyButton adalah turunan dari class MyControl maka dapat digeneralisasi bahwa dua class tersebut juga merupakan MyControl. Kemudian dengan menggunakan overriding method, method DrawControl() yang ada di base class dapat di override di class turunannya sehingga dapat mempunyai implementasi yang berbeda dengan base class.
Dim objList As New MyListBox(23, 23, "Ini ListBox") Dim objControl As MyControl = CType(objList, MyControl) MessageBox.Show(objControl.DrawControl()) Dim objButton As New MyButton(24, 24, "Merah") Dim objControl2 As MyControl = CType(objButton, MyControl) MessageBox.Show(objControl2.DrawControl()) 'akan gagal tidak dapat cast dari MyControl ke 'MyListBox InvalidCastException Dim objCtr As New MyControl(33, 33) Dim objLst As MyListBox = CType(objCtr, MyListBox) objLst.DrawControl()
Dengan menggunakan CType() anda dapat mengkonversi tipe yang lebih spesifik ke tipe yang lebih general, tapi tidak sebaliknya. Jika anda mencoba mengkonversi dari tipe MyControl yang lebih general ke tipe MyListBox yang lebih spesifik maka akan menyebabkan terjadi kesalahan InvalidCastException.
Class yang didefinisikan sebagai abstract class tidak dapat dibuat instan class / objek, class yang didefinisikan abstract hanya dapat digunakan dengan cara diturunkan. Pada VB9 anda harus menggunakan keyword MustInherit untuk membuat abstract class. Kemudian untuk method yang harus diimplementasikan di class turunan diberi keyword MustOverride.
MustInherit Class MyControl Private _left As Integer Public Property Left() As Integer Get Return _left End Get Set(ByVal value As Integer) _left = value End Set End Property Private _top As Integer Public Property Top() As Integer Get Return _top End Get Set(ByVal value As Integer) _top = value End Set End Property Public Sub New(ByVal left As Integer, ByVal top As Integer) Me.Left = left Me.Top = top End Sub 'method abstract yang belum meiliki implementasi Public MustOverride Function DrawControl() As String End Class
Class MyControl diatas mempunyai keyword MustInherit jadi anda tidak dapat menginstansiasi class tersebut secara langsung, class tersebut hanya dapat digunakan dengan cara 134
diturunkan. Method DrawControl() juga memiliki keyword MustOverride ini berarti method tersebut harus dioverride di class turunannya karena di abstract class method ini belum diimplementasikan.
Class MyListBox Inherits MyControl Private content As String Public Sub New(ByVal left As Integer, ByVal top As Integer, ByVal content As String) MyBase.New(left, top) Me.content = content End Sub 'method yang harus diimplementasikan dari abstract class Public Overrides Function DrawControl() As String Return String.Format("Menggambar ListBox pada posisi ({0},{1}) dan isi content :{2}", Left, Top, content) End Function End Class Class MyButton Inherits MyControl Public Sub New(ByVal left As Integer, ByVal top As Integer) MyBase.New(left, top) End Sub Public Overrides Function DrawControl() As String Return String.Format("Menggambar Button pada posisi ({0},{1}) dan warnanya :{2}", Left, Top) End Function End Class
Class MyListBox dan MyButton diturunkan dari abstract class MyControl. Ini berarti kedua class tersebut harus menyetujui kontrak yang sudah didefinisikan di base class, 135
yaitu harus mengimplementasikan method yang MustOverride yaitu DrawControl(). Abstrac class juga mendukung konsep polymorphism sama seperti contoh penggunaan Inheritance sebelumnya.
Dim objList As New MyListBox(12, 12, "ListBox Content") Dim objButton As New MyButton(24, 24) Dim arrControl(1) As MyControl arrControl(0) = objList arrControl(1) = objButton For Each ctr In arrControl MessageBox.Show(ctr.DrawControl()) Next
Karena MyListBox dan MyButton merupakan turunan dari abastract class MyContol maka kedua class tersebut dapat digeneralisasi sebagai class MyControl juga.
Interface
Jika anda ingin mendefinisikan tipe baru tetapi tidak ingin mengimplementasikan isinya secara langsung maka anda dapat menggunakan interfaces. Pada dasarnya interface adalah sebuah kontrak, ketika anda mendesign interface seolah-olah anda mengatakan jika anda ingin menggunakan class ini maka anda harus mengimplementasikan method dan property yang sudah disediakan. Class yang menggunakan interface tersebut setuju dengan kontrak dan mengimplementasikan requirement yang ditentukan. Dibandingkan dengan abstract class, abstract class hanya bisa digunakan di class paling atas top-hierarchy sedangkan interface dapat digunakan di setiap class yang diinginkan (setiap class dapat mengimplementasikan lebih dari satu interface).
136
Interface hanya dapat digunakan dengan cara diimplementasikan pada class tertentu. Class yang menggunakan interface tersebut harus mengimplementasikan 137
Method dan properties yang ada di IStorable akan diimplementasikan di class Document.
Dim objDoc As New Document("New Document") objDoc.Read() objDoc.Write()
138
Kemudian kita akan mebuat array bertipe IStorable dan memasukan class Documen dan class Image didalamnya, ini 139
dapat dilakukan karena class Documen dan class Image mengimplementasikan interface IStorable.
Dim objDoc As New Document("New Document") Dim objImage As New Image("New Image") Dim arrStore(1) As IStorable arrStore(0) = objDoc arrStore(1) = objImage For Each store In arrStore store.Read() store.Write() Next
140
Inherits IStorable, ILogCompressible Sub LogOriginalSize() End Interface Interface IEncryptable Sub Encrypt() Sub Decrypt() End Interface Class Document Implements IStorableCompressible, IEncryptable Private _status As Integer Public Sub New(ByVal s As String) MessageBox.Show("Create : " & s) End Sub Public Sub Compress() Implements ICompressible.Compress MessageBox.Show("Mengimplementasikan method Compress") End Sub Public Sub Decompress() Implements ICompressible.Decompress MessageBox.Show("Mengimplementasikan method Decompress") End Sub Public Sub Decrypt() Implements IEncryptable.Decrypt MessageBox.Show("Mengimplementasikan method Decrypt") End Sub Public Sub Encrypt() Implements IEncryptable.Encrypt MessageBox.Show("Megimplementasikan method Encrypt") End Sub Public Sub LogSavedBytes() Implements
141
ILogCompressible.LogSavedBytes MessageBox.Show("Mengimplementasikan method LogSavedBytes") End Sub Public Sub Read() Implements IStorable.Read MessageBox.Show("Mengimplementasikan method Read") End Sub Public Property Status() As String Implements IStorable.Status Get Return _status End Get Set(ByVal value As String) _status = value End Set End Property Public Sub Write(ByVal obj As Object) Implements IStorable.Write MessageBox.Show("Mengimplementasikan method Write") End Sub Public Sub LogOriginalSize() Implements IStorableCompressible.LogOriginalSize MessageBox.Show("Mengimplementasikan method LogOriginalSize") End Sub End Class
Dapat diluhat pada contoh diatas bahwa sebuah class dapat mengimplementasikan banyak interface.
Dim objDoc As New Document("New Document") objDoc.Compress() objDoc.Decompress() objDoc.Decrypt() objDoc.Encrypt() objDoc.LogOriginalSize() objDoc.LogSavedBytes() objDoc.Read()
142
143
BAB 7 Collection
Pada bab ini kita akan membahas salah satu object yang banyak digunakan pada .NET yaitu Collection. Collection mirip dengan array namun lebih fleksible. Array mempunyai kapasitas yang terbatas, anda harus menentukan kapasitas dari array terlebih dahulu sebelum menggunakannya. Anda juga harus mendefinisikan tipe data dari nilai yang akan dimasukan kedalam array. Collection dapat berisi tipe apapun karena akan dikonversi menjadi tipe object. Collection juga memiliki kapasitas yang dinamis jadi anda tidak perlu mendefinisikan ukurannya terlebih dahulu seperti pada Array. Pada bab ini akan dibahas bermacam-macam object Collection yang ada pada .NET yaitu: ArrayList List(Of T) Queue(Of T) Stack(Of T) Dictionary(Of K,T)
ArrayList
Tidak seperti array yang punya keterbatasan ukuran, dengan menggunkan ArrayList anda dapat membuat array yang dinamis. ArrayList terdapat pada namespace System.Collection, cara penggunaannya:
Dim arrNama As New ArrayList 'menambahkan object kedalam ArrayList arrNama.Add("erick") arrNama.Add("rully") arrNama.Add("naren")
144
arrNama.Add("ronald") MessageBox.Show(arrNama(3).ToString) 'menampilkan semua elemen dalam ArrayList For Each nama In arrNama MessageBox.Show(nama.ToString) Next
Dapat anda lihat pada kode diatas bahwa ArrayList tidak membatasi tipe data apa saja yang dapat dimasukan. Jadi ketika anda memasukan data kedalam ArrayList maka tipenya akan dikonversi menjadi object (dikenal dengan istilah boxing), dan ketika anda mengambil data dari ArrayList maka terjadi proses konversi dari object menjadi tipe data yang diinginkan. Misal pada kode diatas ketika for each dijalankan maka akan terjadi proses konversi dari object menjadi string (dikenal dengan istilah unboxing). Boxing dan unboxing dapat memperlambat performa program yang anda buat. Misal ketika anda memasukan nilai integer kedalam ArrayList maka nilai akan dikonversi menjadi object (boxing), pada saat ini terjadi proses perubahan jenis tipe data dari value type ke reference type. Kemudian ketika kita menampilkan nilai yang ada pada ArrayList akan terjadi perubahan data dari reference type ke value type (unboxing) yaitu dari tipe object ke integer. Selain proses boxing dan unboxing penggunaan ArrayList juga dapat menyebabkan kesalahan yang fatal dan tidak terdeteksi pada saat design time. Contohnya:
Dim mhs As New Mahasiswa Dim arrNama As New ArrayList arrNama.Add("erick") arrNama.Add("rully") 'kesalahan tapi tidak terdeteksi arrNama.Add(mhs) arrNama.Add("naren") For Each nama As String In arrNama MessageBox.Show(nama.ToString)
145
Next
Pada kode diatas penambahan elemen bertipe object mhs sebenarnya tidak boleh karena elemen yang lain bertipe string (collection biasanya menyimpan elemen yang tipenya sejenis) tapi karena elemen dari ArrayList semua dikonversi ke object kesalahan tersebut tidak terdeteksi pada saat design time. Namun ketika elemen ditampilkan akan terjadi error karena object mhs gagal dikonversi menjadi string. Untuk menghindari kesalahan dan masalah boxing dan unboxing maka disarankan menggunakan Collection yang mendukung Strongly Typed Collection.
Generic Collection
Fitur Generic mulai ada di .NET versi 2.0 Dengan menggunakan Generic anda dapat membuat Typed Safe Collection untuk menghindari kesalahan seperti pada contoh ArrayList sebelumnya. Typed Safe Collection juga tidak harus melewati proses boxing dan unboxing seperti pada ArrayList. Pada .NET yang termasuk Strongly Typed Collection adalah List(Of T), Stack(Of T), Queue(Of T), dan Dictionary(Of K,T).
List(Of T)
List(Of T) merupakan object based collection yang diturunkan dari class System.Collection.Generic dan termasuk Typed Safe Collection. Fungsi dari List(Of T) sama dengan ArrayList hanya saja tipe data dari elemen yang disimpan sudah jelas (bukan tipe object seperti pada ArrayList).
Dim lstNama As New List(Of String) lstNama.Add("erick") lstNama.Add("rully") lstNama.Add("naren") MessageBox.Show(lstNama(1)) For Each nama As String In lstNama MessageBox.Show(nama.ToString)
146
Next
Dengan menggunakan strongly typed collection List(Of T) maka anda dapat menentukan tipe data yang akan dimasukan kedalam collection. Jika tipe data yang dimasukan tidak tepat maka Visual Studio akan menampilkan kesalahan pada saat design time (jika option strict off).
Dim lstNama As New List(Of String) lstNama.Add("erick") lstNama.Add("rully") 'akan muncul kesalahan karena tipe yang diinputkan bukan 'string tapi integer lstNama.Add(12)
List(Of T) juga memiliki method-method yang dapat digunakan untuk memanipulasi elemen yang ada dalam collection. Misalnya anda ingin menghapus collection, mengurutkan, mencari, dan masih banyak lagi.
'menghapus elemen dengan alamat 2 lstNama.RemoveAt(2) 'mengurutkan elemen lstNama.Sort() 'menghapus semua elemen lstNama.Clear()
Stack(Of T)
Stack adalah Collection yang merepresentasikan struktur data tumpukan secara LIFO (Last In First Out). Stack(Of T) juga diturunkan dari namespace System.Collection.Generic. Stack(Of T) memiliki ukuran kapasitas yang dinamis dan termasuk dalam type safe Collection. Stack(Of T) mempunyai dua method utama yang dapat digunakan yaitu push dan pop. Method push untuk menambahkan elemen kedalam Stack(Of T), sedangkan method pop untuk mengambil elemen dari Stack(Of T). 147
Gambar 7.1 Representasi Tumpukan Dim stackBil As New Stack(Of Integer) stackBil.Push(12) stackBil.Push(7) stackBil.Push(9) stackBil.Push(33) 'mengambil tumpukan yang paling atas Dim bil As Integer = stackBil.Pop MessageBox.Show("Bilangan teratas :" & bil) 'untuk menapilkan semua elemen dalam tumpukan For Each b As Integer In stackBil MessageBox.Show(b.ToString) Next
Method push() digunakan untuk menambahkan elemen ke stack, dan method pop() digunakan untuk mengambil elemen dari stack. Karena stack merepresentasikan struktur data tumpukan (LIFO) maka ketika method pop() dijalankan yang diambil adalah elemen teratas dari stack. Jika anda menampilkan semua elemen menggunakan for each maka data yang ditampilkan juga akan terurut mulai dari elemen yang paling atas.
Queue(Of T)
Queue adalah struktur data yang merepresentasikan struktur data antrian secara FIFO (Fist In First Out). Queue(Of T) juga diturunkan dari namespace System.Collection.Generic. Queue(Of T) memiliki ukuran yang dinamis dan termasuk 148
dalam type safe Collection. Queue(Of T) mempunyai dua method utama yaitu enqueue() untuk memasukan elemen kedalam queue dan dequeue() untuk mengambil elemen dari dalam queue.
Gambar 7.2 Representasi Antrian Dim queBil As New Queue(Of Integer) queBil.Enqueue(12) queBil.Enqueue(22) queBil.Enqueue(55) queBil.Enqueue(11) Dim bil As Integer = queBil.Dequeue For Each b As Integer In queBil MessageBox.Show(b.ToString) Next
Method enqueue() digunakan untuk menambahkan elemen kedalam queue, sedangkan method dequeue() digunakan untuk mengambil elemen dari queue. Karena Queue merepresentasikan antrian (FIFO) maka ketika method dequeue() dijalankan yang diambil adalah antrian dengan 149
urutan yang pertama. Jika anda menampilkan semua elemen pada queue menggunakan for each maka urutan akan ditampilkan dari elemen yang paling awal.
Dictionary(Of T)
Dictionary merupakan object based Collection yang terdapat dalam namespace System.Collection.Generic. Dictionary adalah collection yang memiliki key dan value (mirip dengan hash table). Dictionary(Of T) juga termasuk dalam safe type collection. Dengan menggunakan Dictionary anda dapat membuat collection yang memiliki index bertipe selain integer (mis string, double).
Dim dictBio As New Dictionary(Of String, String) dictBio("name") = "Erick Kurniawan" dictBio("jobs") = "Lecturer" dictBio("city") = "Jogjakarta" MessageBox.Show(dictBio("jobs")) For Each kvp As KeyValuePair(Of String, String) In dictBio MessageBox.Show(kvp.Key & " : " & kvp.Value) Next
Dengan menggunakan dictionary anda dapat membuat collection yang index atau kuncinya bertipe string, jadi anda dapat mengambil nilai dari elemen tertentu menggunakan kunci, misal dictBio(name). Untuk mengambil keseluruhan kunci beserta elemen dalam dictionary kita dapat menggunakan object bertipe KeyValuePait untuk menampung datanya. KeyValuePair terdiri dari dua properti yaitu key yang merepresentasikan kunci dan properti value yang merepresentasikan nilai.
150
Memahami Error
Pada aplikasi yang anda buat kesalahan bisa ditemukan dimana saja. Macam-macam error yang mungkin terjadi ketika anda menulis program adalah:
Sintaks Error
151
Kesalahan ini adalah yang paling mudah untuk dideteksi, karena terjadi pada saat design time (saat anda menuliskan sintaks program di editor). VB9 editor di Visual Studio menyediakan pengecekan error yang sangat user friendly karena ketika anda salah mengetikan sintaks maka Visual Studio langsung memberi tanda, atau membetulkannya secara otomatis.
Runtime Error
Runtime Error akan terjadi pada saat program dijalankan. Ketika error terjadi maka akan ada peringatan error kepada user dan kemudian program akan dihentikan secara otomatis. Misalnya ada kode untuk membuka file, namun file tersebut tidak ada, atau seharusnya input adalah tipe integer tapi anda 152
memasukan tipe string. Anda dapat menangani jenis error ini menggunakan exception handling.
Logic Error
Logic Error terjadi dikarenakan kesalahan logika pemrograman, ini adalah jenis error yang paling sulit untuk dideteksi. Untuk mendeteksi Logic Error anda dapat melakukan test atau debugging pada kode anda.
Pengaturan Option Strict Off berarti kompiler VB akan melakukan konversi narrowing secara otomatis. Narrowing 153
konversi adalah konversi dari tipe data yang lebih besar ke tipe data yang lebih kecil. Misal dari tipe long ke tipe integer. Untuk konversi dari tipe data yang lebih kecil ke tipe data yang lebih besar disebut konversi widening (otomatis dilakukan oleh compiler walau Option Strict On).
'Option Strict Off 'otomatis narrowing conversion Dim dblBil As Double = 12.54 Dim intBil As Integer = dblBil MessageBox.Show(intBil) 'Option Strict On 'narrowing conversion dilakukan eksplisit oleh programmer Dim dblBil As Double = 14.45 Dim intBil As Integer = CInt(dblBil) MessageBox.Show(intBil.ToString)
Penggunaan Option Strict Off tidak disarankan karena dapat menimbulkan error pada saat runtime. Misal anda memberikan nilai yang lebih besar dari tipe datanya.
Kode diatas jika dijalankan akan error karena variable shBil yang bertipe Short hanya mampu menampung nilai maksimal 32000, jika nilai yang dimasukan lebih besar maka akan terjadi error OverFlowException. Jika anda menggunakan Option Strict Off maka kesalah ini tidak akan terdeteksi pada saat design time. Option Strict Off juga mengijinkan anda untuk melakukan late binding. Late binding adalah sebuah cara untuk menentukan jenis tipe data dari variable diakhir setelah variable tersebut diberi nilai. Karena belum tahu tipe datanya maka variable tersebut bertipe Object.
'parameter pada function belum ditentukan tipe datanya
154
Function GetLuas(ByVal n1 As Object, ByVal n2 As Object) As Integer Return n1 + n2 End Function 'menggunakan late binding Dim luas As Integer = GetLuas(12, 34) MessageBox.Show(luas)
Function GetLuas() memiliki parameter yang bertipe object yang dapat diisi tipe data yang diinginkan. Karena beberapa masalah yang dapat ditimbulkan maka anda disarankan menggunakan Option Strict On, namun pada kasus tertentu jika anda membutuhkan late binding anda dapat mengubah setting Option Strict menjadi Off. Cara untuk mengubah Option Strict ada 2 macam, cara yang pertama klik kanan pada project pilih Properties pilih tab compile, disana anda dapat mengatur Option Strict menjadi On atau Off untuk pengaturan default Option Strict pada program yang anda buat.
Cara yang kedua anda dapat menuliskannya secara explicit di dalam program anda dibagian paling atas (berlaku tiap untuk tiap file .vb).
Option Strict Off Public Class Form1 . End Class
Satu lagi pengaturan yang digunakan adalan Option Infer, nilai Option Infer defaultnya adalah On. Option Infer ada sejak VB9 (.NET 3.5). pada VB9 anda dapat mendeklarasikan variable tanpa menyebut tipe datanya namun harus diberi nilai default, maka kompiler VB akan dapat secara otomatis 155
menginfer tipe datanya. Fitur ini sebenarnya disiapkan untuk mendukung LINQ agar dapat digunakan dengan lebih mudah. Pengaturan Option Infer disarankan untuk On.
Line Number
Secara default Visual Studi tidak menampilkan line number pada tampilan kode editor. Namun anda dapat menampilkannya dengan cara klik menu tools Options pilih Text Editor Basic beri tanda check pada Line Number. Menampilkan line number penting karena setiap error yang terdeteksi akan ditunjukan dengan line number.
Anda dapat menggunakan Visual Studio untuk melihat jalannya program yang sedang anda buat, caranya: 5. Untuk melihat jalannya program yang anda buat, anda harus meletakan tanda breakpoint pada salah satu baris pada program anda. Untuk menambahkan breakpoint caranya klik pada bagian kiri kode anda atau tekan F9. 6. Pada saat program di jalankan maka program akan berhenti sementara pada baris yang anda tandai dengan breakpoint. Baris tersebut secara otomatis akan di highlight dengan warna kuning.
7. Kemudian anda dapat melakukan pelacakan pada program anda baris per baris dengan menekan tombol F11. Pada saat anda melakukan step into (F11) maka anda dapat mengetahui isi dari setiap variable per baris ketika program sedang berjalan.
Toggle Breakpoint : untuk memberi tanda pada bagian program yang akan diberi breakpoint. Step Into (F11) : perintah ini digunakan untuk mengecek baris per baris dari program. Step Over (F10) : perintah ini mirip dengan Step Into yang digunakan untuk mengecek program perbaris bedanya Step Over tidak mengecek kode yang berada pada kalang subroutine dan function. Anda dapat melihat baris kode yang diberi breakpoint dengan cara menggunakan breakpoint window. Klik pada menu Debug Windows Breakpoints
Exception Handling
Ketika anda membuat program tidak semua kesalahan dapat anda tangani karena mungkin kesalahan tersebut bukan dikarenakan anda salah menuliskan kode namun dari inputan user, kondisi jaringan, atau faktor lain diluar kode anda. Misal program anda mencoba membaca file sedangkan file tersebut sudah dihapus maka akan menyebabkan program error. Pada VB9 anda dapat menggunakan exception handling untuk mengecek apakah kode blok yang anda buat menimbulkan kesalahan. Misalnya anda mempunyai program sebagai berikut:
Class Mahasiswa Public nim As String End Class
158
Module Module1 Sub CobaKesalahan() Dim objMhs As Mahasiswa = Nothing objMhs.nim = 12 End Sub Sub Main() 'jika dijalankan akan terjadi error CobaKesalahan() End Sub End Module
Program diatas jika dijalankan akan menyebabkan terjadinya error System.NullReferenceException karena object objMhs belum dibuat tapi sudah diberi nilai. Error tersebut akan membuat aplikasi anda terhenti. Anda dapat menggunakan struktur Try Catch untuk menangkap error yang terjadi dan memberi solusi terhadap error tersebut. Program yang akan anda periksa dapat dimasukan kedalam blok Try, sedangkan jika terjadi kesalahan dapat ditangkap atau dideteksi di kalang Catch.
Try CobaKesalahan() Catch ex As Exception Console.WriteLine("Kesalahan : " & ex.Message) End Try
Jika method CobaKesalahan() dijalankan dan menyebabkan error maka akan dicek errornya di kalang Catch untuk ditampilkan atau ditangani lebih lanjut. Anda juga dapat menggunakan blok Finally yang adapat dituliskan setelah blok Catch. Finally adalah blok yang pasti akan dijalankan meskipun tidak terjadi error. Kode yang dimasukan kedalam blok Finally biasanya digunakan untuk menutup koneksi ke resource seperti database atau text.
Dim baris As String Dim myFile As System.IO.StreamReader = Nothing Try myFile =System.IO.File.OpenText("tidakada.txt")
159
baris = myFile.ReadLine() Catch ex As Exception Console.WriteLine("Error :" & ex.Message) Finally 'jika filestream terbuka akan ditutup disini If Not myFile Is Nothing Then myFile.Close() End If End Try
Pada contoh diatas jika object myFile ada isinya maka ketika sampai pada kalang Finally akan ditutup koneksinya dengan resource file. Jika file tidak ada maka akan ditampilkan errornya pada kalang Catch.
160
ElseIf sqlEx.Number = 2627 Then Console.WriteLine("Kode Customer sudah ada...") Else Console.WriteLine("Error : " & sqlEx.Message & " Number :" & sqlEx.Number) End If Catch ex As Exception Console.WriteLine("Error : " & ex.Message) End Try
Pada kode diatas anda dapat menggunakan beberapa kalang Catch untuk menangkap error yang lebih spesifik. Misal untuk menagkap error yang terjadi karena koneksi atau kesalahan perintah query anda dapat menggunakan SqlException. Dengan menggunakan SqlException anda dapat mengambil error number dari kesalahan yang mungkin terjadi menggunakan properti Number. Misal dari program diatas untuk kesalahan duplikasi primary key error numbernya 2627 sedangkan untuk kesalahan kolom tidak boleh bernilai NULL error numbernya 515. Dengan mengetahui kesalahan secara spesifik anda dapat memberi error handler satu persatu untuk kesalahan tersebut.
Batasan Bahasa : object Exception ada didalam .NET Framework sehingga didukung semua bahasa yang messuport .NET. Anda dapat throw exception menggunakan VB9 dan catch exception menggunakan C#. Keterbatasan Informasi : Errobject pada VB6 tidak mempunyai cukup informasi tentang error yang terjadi.
Throw Exception
Jika anda membuat class maka anda harus melakukan throw exception jika terjadi kesalahan pada kode di class tersebut. Untuk itu gunakan keyword Throw. Perhatikan kode dibawah ini: 162
Public Class Mahasiswa Private _nim As String Public Property Nim() As String Get Return _nim End Get Set(ByVal value As String) If value.Length <> 8 Then Throw New Exception("Panjang Nim tidak boleh lebih dari 8 karakter") Else _nim = value End If End Set End Property End Class
Pada class Mahasiswa akan dilakukan pengecekan apakah panjang dari nilai yang dimasukan kedalam fields Nim 8 karakter, jika lebih atau kurang dari 8 karakter maka class tersebut akan melempar kesalahan. Anda dapat mnangkap kesalahan yang dilempar oleh class Mahasiswa dengan cara:
Dim objMhs As New Mahasiswa Try objMhs.Nim = "220023211" Catch ex As Exception MessageBox.Show("Error : " & ex.Message) End Try
UnhandledException Event
Jika aplikasi anda gagal menangkap exception yang terjadi maka aplikasi anda akan berakhir. Seperti yang sudah kita bahas diatas anda dapat menggunakan structure exception handling dan melakukan debugging pada kode anda. Meskipun anda sudah sangat teliti namun kemungkinan error yang tidak diduga masih dapat terjadi. Untuk pertahanan terakhir terhadap error anda dapat memanfaatkan event UnhandledException. 163
Untuk menambahkan event UnhandledException double click folder MyProject pada solution explorer pilih Application tab klik pada tombol View Application Event pada project properties window kemudian pada drop-down list pilih event UnhandledException. Maka Visual Studio akan menggenerate method event handler, masukan kode untuk menghandle kesalahan pada method tersebut.
Private Sub MyApplication_UnhandledException(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptio nEventArgs) Handles Me.UnhandledException MessageBox.Show("Kesalahan ini tidak dapat dihandle oleh aplikasi anda", e.Exception.GetType.Name) If TypeOf e.Exception Is ApplicationException Then e.ExitApplication = False End If End Sub
Untuk mencoba program diatas jalankan .exe dari program tersebut (bukan dari visual studio). Jika terjadi error yang tidak dapat ditangani oleh kode yang anda buat dalam aplikasi anda maka akan muncul pesan diatas dan program akan diakhiri.
164
ADO menggunakan object Recordset untuk akses data yang notabene ditujukan untuk connected data access artinya untuk akses data maka object tersebut harus selalu terkoneksi ke database, meskipun sebenarnya Recordset juga bisa digunakan untuk disconnected data access. Recordset tidak mendukung penyimpanan / akses data untuk tabel lebih dari satu. Bila kita ingin
165
melakukan hal tersebut maka query nya harus dimodifikasi dengan menggunakan perintah Join. ADO tidak cocok digunakan untuk transfer data dalam jumlah record yang besar, terutama pertukaran data antar distributed application. Hal itu disebabkan karena ADO menggunakan teknik COM Marshalling. Teknik tersebut tidak efisien, karena terjadi proses konversi tipe data antar aplikasi. Selain itu juga terdapat masalah security firewall. Dukungan terhadap XML terbatas.
Mungkin itu hanya beberapa kekurangan ADO apabila dibandingkan dengan ADO.Net yang penulis rasakan. Semua kekurangan diatas dijawab oleh Microsoft dengan adanya ADO.Net. Sekarang saatnya anda berpaling ke ADO.Net.
Arsitektur
Secara umum ADO.Net itu terdiri dari dua komponen utama, yaitu : 1. ADO.Net Data Provider 2. DataSet ADO.Net Data Provider merupakan komponen yang terdiri dari object-object yang spesifik terhadap masing-masing database provider dan sifatnya Connected, sehingga sering disebut dengan istilah Connected Data Access. Komponen ADO.Net Data Provider terdiri dari objectobject:
Connection Command
166
DataReader DataAdapter
1.1
Connection : Object yang digunakan melakukan koneksi ke sumber data. Command : Object yang digunakan melakukan eksekusi query SQL Statement.
untuk untuk
167
Object
yang
digunakan
untuk
DataAdapter : Object yang menjembatani antara sumber data dan DataSet dalam pengambilan dan manipulasi data.
Keterangan lebih detail mengenai semua object diatas akan diterangkan pada bab berikutnya. Berikut penjelasan untuk object-object yang terdapat di dalam DataSet :
DataSet : Object yang digunakan untuk menyimpan data dalam mode disconnected. DataSet ini sebagai kontainer untuk object DataTable dan DataRelation yang disimpan didalam memory. DataSet dapat memiliki lebih dari satu DataTable. DataTable : Object ini hampir sama fungsinya seperti DataSet. Untuk membuat DataTable tidak harus selalu membuat object DataSet terlebih dahulu, dalam arti lain bahwa DataTable itu dapat berdiri sendiri. Object ini merupakan kumpulan dari DataRow, DataColum dan Constraint yang merupakan representasi dari row / record, kolom, dan konstrain yang terdapat pada tabel di database. DataRelation : Object ini merupakan representasi relationship antar tabel yang terdapat di database.
Komponen ADO.NET Data Provider terdapat di dalam masing-masing namespace yang bersesuain dengan database provider. Misalnya jika database yang digunakan SQL Server versi 7.0 ke atas maka namespace yang digunakan yaitu System.Data.SqlClient, sedangkan jika databasenya SQL 168
Server versi 7.0 ke bawah atau MS.Access maka namespace yang digunakan yaitu System.Data.OleDb. Begitu juga jika aplikasi yang digunakan masih menggunakan teknologi ODBC maka namespace yang digunakan yaitu System.Data.Odbc. ADO.NET DataSet menggunakan namespace yang berbeda dengan ADO.NET Data Provider, karena komponen ini tidak tergantung dari jenis database provider. .Net framework menyediakannya didalam namespace System.Data. Pada ADO.NET versi 2.0 disediakan data akses komponen dengan model factory. Komponen ini digunakan jika database yang digunakan belum ditentukan terlebih dahulu pada saat aplikasi sedang dibangun, atau jika anda ingin membuat aplikasi dimana database yang digunakan dapat dirubah secara fleksibel. Namespace yang digunakan yaitu System.Data.Common. Semua namespace yang berhubungan dengan Data dan spesifik terhadap database provider tertentu diturunkan dari class yang terdapat didalam namespace tersebut.
ODBC
169
Open Database Connectivity (ODBC) merupakan API pertama yang dibuat oleh Microsoft sebagai langkah awal untuk menyeragamkan antarmuka semua database provider. Sehingga semua database provider yang ingin sistem databasenya dapat digunakan harus membuat driver tersendiri yang mendukung teknologi ODBC. Hal ini memudahkan pengguna, karena mereka tidak harus lagi langsung berbicara dengan sistem database, melainkan menggunakan driver ODBC yang telah membungkus semua fungsionalitas sistem database yang dipakai apabila dibandingkan dengan harus berinteraksi langsung dengan databasenya. Pada saat ini teknologi ODBC hanya digunakan untuk database-database lama, misalnya Access, SQL Server ataupun Oracle dengan versi yang terdahulu. ODBC ini memiliki beberapa kelemahan diantaranya yaitu tidak adanya dukungan untuk mengakses data yang siftanya hirarki, jadi teknologi ini hanya mendukung relational database.
OLE DB
Object Linking And Embedded Database (OLE DB) merupakan teknologi data akses terbaru setelah ODBC. Teknologi ini menghapus semua kekurangan-kekurangan yang dimiliki oleh ODBC, diantranya ialah masalah akses data terhadap database yang sifatnya hirarki dan juga tingkat performansi akses data lebih ditingkatkan lagi. Teknologi ini digunakan untuk database versi terbaru pada saat itu, dan sampai sekarang pun masih digunakan. Dengan teknologi ini kita dapat membuat aplikasi yang independent terhadap database yang digunakan.
digunakan untuk akses data terhadap SQL Server 2005. ODBC dan OLE DB merupakan komponen yang termasuk ke dalam MDAC (Microsoft Data Access Component) yang juga merupakan komponen yang termasuk kedalam operating system windows. SQL Native Client (SQLNCLI.dll) ini merupakan library yang berdiri sendiri dan merupakan penggabungan antara ODBC dan OLE DB. Library ini dapat dicari pada installer SQL Server 2005 dengan nama file sqlncli.msi. Jika anda melakukan instalasi SQL Server 2005 maka secara default file tersebut terinstal. Data akses ini mengekspose fitur-fitur baru yang terdapat di dalam SQL Server 2005 seperti MARS (Multiple Active Result Set), tipe data xml di SQL Server 2005, User Defined Data Type (UDT), Query Notification, dsb. Aplikasi tidak langsung berinteraksi dengan ketiga teknologi data akses tersebut, melainkan melalui sekumpulan library yang kita kenal dengan ADO.NET untuk versi data akses terbaru. Sebelumnya kita mengenal beberapa library yang terdapat didalam DAO (Data Access Object), RDO (Remote Data Object), ADO (ActiveX Data Object). LINQ (Language Integrated Query) merupakan teknik data query terbaru seiring dengan dikeluarkannya .Net Framework 3.5. Teknik ini merupakan alternatif lain selain ADO.NET.
Connection Object
Object ini merupakan object yang penting, karena untuk menggunakan object ADO.NET Data Provider lainnya kita 171
harus mengentahui terlebih dahulu penggunaan dari object Connection. Connection digunakan untuk melakukan koneksi terhadap database. Metoda yang paling sering digunakan yaitu Open dan Close. Object ini terdapat pada masing-masing namespace yang spesifik terhadap database provider. Sebelum menggunakan object connection kita harus mengetahui terlebih dahulu connection string. Connection string ini berisi informasi mengenai database yang dituju, nama server database, jenis authentikasi, informasi user name beserta password.
Connection String
Berikut beberapa atribut umum connection string yang sering digunakan :
Database atau Initial Catalog : Diisi dengan nama database yang digunakan. Server atau Data Source : Diisi dengan nama server atau instance database. Integrated Security : Diisi dengan SSPI. Atribut ini digunakan jika jenis autentikasi yang digunakan untuk melakukan koneksi terhadap databasenya yaitu windows. Trusted Connection : Diisi dengan True atau False. Atribut ini fungsinya sama dengan Integrated Security. Jadi anda bisa memilih salah satunya. User ID atau UID : Diisi dengan nama user name yang terdaftar di database. Opsi ini digunakan jika jenis authentikasi yang digunakan untuk melakukan koneksi terhadap databasenya yaitu SQL Server Login (jika database yang digunakan SQL Server).
172
Password atau PWD : Diisi dengan password dari User ID yang digunakan.
Contoh deklarasi object Connection dengan connection string untuk database SQL Server :
'======sql server authentication===== Private strConn1 As String = _ "database=northwind;server=localhost;uid=sa;pwd=sql2005" Private strConn2 As String = _ "initial catalog=northwind;data source=localhost;uid=sa;pwd=sql2005" '=====windows authentication=== Private strConn3 As String = _ "database=northwind;server=localhost\sql2008;integrated security=true" Private strConn4 As String = _ "database=northwind;server=localhost\sql2008;integrated security=sspi"
Pada kode diatas dapat kita lihat beberapa alternatif penulisan connection string untuk SQL Authentication dan Windows Authentication. Salah satu parameter yang harus diperhatikan yaitu properti server atau data source. Kedua properti tersebut diisi dengan nama instance dari database yang digunakan.
SqlConnection Object
SqlConnection merupakan object yang digunakan untuk terhubung ke database SQL Server versi 7.0 dan versi diatasnya. Object ini terdapat didalam namespace System.Data.SqlClient, sehingga untuk menggunakannya kita harus Imports terlebih dahulu namespace tersebut. 173
Berikut adalah contoh program penggunaan SqlConnection object untuk membuka dan menutup koneksi ke database SQL Server.
1. Buat sebuah Windows Forms Application project template, berikan nama ConnectionObject pada project tersebut. 2. Tambahkan sebuah control button ke dalam form. 3. Ubah nama button tersebut menjadi btnOpenConnection. 4. Tambahkan prosedur event handler untuk event Click button dengan melakukan double klik pada button tersebut. 5. Tambahkan setting Option dan namespace berikut ini di baris kode paling atas :
Option Strict On Imports System.Data.SqlClient
174
MessageBox.Show("Connection State : " _ & sqlConn1.State.ToString) End If End Try End Sub
Dari kode diatas dapat kita lihat bahwa SqlConnection object membutuhkan connection string yang telah didefinisikan sebelumnya sebagai informasi tentang database yang dituju. Method State digunakan untuk mengecek state dari koneksi yang akan digunakan. Method ini berguna agar apabila koneksinya sudah terbuka maka kita ga perlu untuk membukanya kembali. Method Open digunakan untuk membuka koneksi ke database. Sedangkan untuk menutup koneksi terdapat dua alternatif pilihan, yaitu Close atau Dispose. Penggunaan SqlConnection object diatas ditempatkan didalam sebuah structure exception handling yang menggunakan perintah Finally. Kenapa? Perlu diketahui bahwa proses membuka koneksi itu membutuhkan resource yang cukup besar, dari mulai pengecekan koneksi jaringan, handshaking, pengecekan instance database dan juga security nya. Oleh karena itu SQL Server memiliki fitur Connection Pooling. Fitur ini digunakan untuk menyimpan koneksi yang sudah digunakan sebelumnya, sehingga apabila kita membutuhkannya lagi suatu saat maka tidak perlu dibuat dari awal untuk pembentukan koneksi tersebut. Dengan adanya perintah finally maka koneksi selalu dipastikan ditutup setelah dibuka. Hal ini untuk mengurangi jumlah koneksi yang disimpan di pool dimana jumlah maksimumnya secara default yaitu 100. Apabila koneksi dibiarkan terbuka terus maka suatu saat akan mencapai batas 175
maksimum default jumlah koneksi yang disimpan di pool, sehingga apabila terdapat lagi koneksi lain yang akan terhubung ke database yang sama maka koneksi tersebut akan menunggu sampai jumlah koneksi di pool nya berkurang sampai melampaui batas time out connection. Penggunaan exception bertingkat digunakan untuk mencegah kemungkinan-kemungkinan terjadinya error yang dapat disebabkan oleh beberapa hal, seperti kesalahan pengetikkan properti string koneksi, kesalahan authentikasi, security, dll. Sebagai best practice untuk penggunaan connection object, buka koneksi sesaat sebelum digunakan dan tutup koneksi segera setelah digunakan.
ConnectionStringBuilder
Pada contoh diatas sebelumnya object connection menggunakan connection string yang ditulis secara hardcoded. Hal ini dapat menyebabkan kesalahan pengetikkan properti connection string. Mulai di .NET 2.0 disediakan ConnectionStringBuilder object. Diharapkan dengan adanya object ini maka akan terhindar dari kesalahan penulisan properti connectionstring nya. Berikut adalah contoh penggunaan object tersebut :
1. Tambahkan satu button kedalam form yang sama pada lab sebelumnya diatas. 2. Ubah nama button tersebut menjadi btnConnStrBuilder. 3. Ketikkan kode berikut pada prosedur event handler untuk event Click button yang bersangkutan :
Private Sub btnConnStrBuilder_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles btnConnStrBuilder.Click Dim connBuilder As New SqlConnectionStringBuilder
176
connBuilder.DataSource = "localhost" connBuilder.InitialCatalog = "northwind" connBuilder.UserID = "sa" connBuilder.Password = "sql2005" 'connBuilder.IntegratedSecurity = True Dim sqlConn As SqlConnection = Nothing Try sqlConn = New SqlConnection(connBuilder.ToString) sqlConn.Open() MessageBox.Show("Connection Open!") Catch sqlEx As SqlException MessageBox.Show(sqlEx.ToString) Catch ex As Exception MessageBox.Show(ex.ToString) Finally If sqlConn IsNot Nothing Then sqlConn.Dispose() MessageBox.Show("Connection State : " _ & sqlConn.State.ToString) End If End Try End Sub
Kode diatas yang diberikan komentar digunakan apabila jenis authentikasi yang ingin digunakan yaitu Windows, sehingga properti UserID dan Password harus dihilangkan.
Perintah Using
Seperti yang telah dijelaskan sebelumnya, untuk menutup koneksi yang sudah dibuka dapat digunakan salah satu dari method yang disediakan, yaitu Close atau Dispose. Sehingga kita harus memanfaatkan Exception Handling untuk memastikan bahwa objek koneksi yang digunakan selalu ditutup setelah selesai digunakan. 177
Mulai di .NET 2.0 diberikan perintah baru yaitu Using. Perintah ini digunakan untuk melakukan auto disposing sebuah object yang implemen IDisposable interface. Sehingga setelah object tersebut out of scope maka otomatis perintah Dispose akan dipanggil secara implisit untuk object tersebut. Berikut contoh penggunaan Using didalam pembuatan objek koneksi :
1. Tambahkan satu button kedalam form yang sama pada lab sebelumnya diatas. 2. Ubah nama button tersebut menjadi btnUsing. 3. Ketikkan kode berikut pada prosedur event handler untuk event Click button yang bersangkutan :
Private Sub btnUsing_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUsing.Click Using sqlConn As New SqlConnection(strConn1) sqlConn.Open() MessageBox.Show("Connection Open!") End Using End Sub
Setelah variabel sqlConn tersebut keluar dari blok Using maka otomatis akan di dispose.
My.Settings Namespace
Pada contoh-contoh sebelumnya, connection string yang digunakan masih diketik secara hard-coded, sehingga nantinya apabila terdapat perubahan maka kode programnya harus dibuka, diubah kemudian di kompilasi ulang kemudian di deploy kembali. Sungguh sebuah pekerjaan yang tidak seharusnya dilakukan. 178
Mulai di Visual Basic 2005 telah disediakan My namespace. Namespace ini berisi shortcut-shortcut ke beberapa namespace-namespace yang terdapat di dalam .NET framework. Salah satu class yang terdapat didalam namespace tersebut yaitu My.Settings. Class tersebut digunakan untuk mengakses dan memanipulasi data yang disimpan di dalam file configuration (file exe.config) dan dibentuk dengan format XML. Dengan menyimpan connection string di dalam file configuration maka apabila terjadi perubahan maka kita tinggal merubah file tersebut tanpa harus membuka kembali kode programnya. Berikut contoh program penggunaan file configuration untuk menyimpan connection string dan diakses lewat My.Settings namespace :
1. Double klik My Project node didalam Solution Explorer pada project yang telah dibuat sebelumnya atau klik kanan project nya dan pilih menu Properties. 2. Pada bagian settings tambahkan variabel untuk menyimpan connection string seperti yang terlihat pada gambar dibawah ini :
3. Tambahkan satu button kedalam form yang sama pada lab sebelumnya diatas. 4. Ubah nama button tersebut menjadi btnMyNamespace.
179
5. Ketikkan kode berikut pada prosedur event handler untuk event Click button yang bersangkutan :
Private Sub btnMyNamespace_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles btnMyNamespace.Click Using sqlConn As New SqlConnection(My.Settings.ConnectionStringApp) sqlConn.Open() MessageBox.Show("Connection Open!") End Using End Sub
180
Default provider yang digunakan yaitu RsaProtectedConfigurationProvider. Perbedaan diantara kedua provider tersebut yaitu data hasil enkripsi dengan menggunakan Rsa dapat digunakan di komputer lain apabila aplikasi tersebut diinstal pada komputer yang berbeda. Hal tersebut dimungkinkan karena key enkripsi juga disimpan didalam data connection string yang di enkripsi. Namun tidak demikian dengan DataProtectedConfigurationProvider. Data hasil enkripsi untuk connection string tidak dapat digunakan langsung di komputer yang berbeda, karena data enkripsi yang dihasilkan tersebut bergantung pada CPU yang digunakan. Sehingga datanya harus di dekripsi terlebih dahulu, setelah itu baru dienkripsi. Programmer tidak membutuhkan lagi proses untuk melakukan dekripsi connection string yang telah di enkripsi. Proses deksripsi dilakukan secara otomatis ketika data tersebut digunakan. Berikut ini contoh program untuk melakukan enkripsi connection string dengan kedua provider diatas :
1. Tambahkan sebuah GroupBox, dua RadioButton dan satu Button. 2. Ubah text radio button pertama menjadi Encrypt dan name nya diubah menjadi rbEncrypt. 3. Ubah text radio button kedua menjadi Decrypt dan name nya diubah menjadi rbDecrypt. 4. Ubah name button menjadi btnEncryptProcess
181
5. Design form dapat dilihat seperti dibawah ini (gabungan dari lab pertama sampai yang sekarang) :
182
183
Dim connectionElement = configFile.GetSection("connectionStrings") If Encrypt Then 'connectionElement.SectionInformation.ProtectSection( _ '"DataProtectionConfigurationProvider") 'RsaProtectedConfigurationProvider connectionElement.SectionInformation.ProtectSection(Nothing ) Else connectionElement.SectionInformation.UnprotectSection() End If connectionElement.SectionInformation.ForceSave = True configFile.Save(ConfigurationSaveMode.Modified) MessageBox.Show("Encrypt : " & Encrypt.ToString) Catch ex As Exception MessageBox.Show(ex.ToString) End Try End Sub
Prosedur diatas digunakan untuk melakukan enkripsi data connection string yang disimpan di file .config. Apabila input parameter yang digunakan untuk method ProtectSection yaitu Nothing maka default provider yang digunakan RsaProtectedConfigurationProvider. Apabila provider yang ingin digunakan merupakan DataProtectedConfigurationProvider maka anda harus menggunakan nama provider tersebut untuk passing input parameter method ProtectSection seperti yang dapat dilihat pada bagian kode yang di berikan komentar.
184
9. Tambahkan kode berikut pada prosedur event handler untuk event click button btnEncryptProcess :
Private Sub btnEncryptProcess_Click(ByVal sender As _ System.Object, ByVal e As System.EventArgs) _ Handles btnEncryptProcess.Click EncryptConnection(rbEncrypt.Checked) End Sub
10. Jalankan program. Lakukan proses enkripsi dan dekripsi. 11. Buka file konfigurasi pada folder aplikasi :
12. Apabila setting show extension file nya diaktifkan pada Folder Options maka file nya akan terlihat seperti dibawah ini :
Command Object
Command object digunakan untuk melakukan eksekusi query SQL statement dari kode program. Object ini dapat digunakan untuk membaca dan memanipulasi data. Selain itu juga perintah Data Definition Language (DDL) dapat juga di eksekusi lewat object ini, misalnya perintah untuk Create database atau table.
Manipulasi Data
Command object sering digunakan untuk melakukan manipulasi data terdahap tabel-tabel yang terdapat didalam database. Perintah Data Manipulation Language (DML) yang dapat digunakan yaitu : Update, Delete dan Insert. Berikut ini contoh program untuk melakukan manipulasi data dengan menggunakan perintah Update. Perintah DML lainnya pada prinsipnya sama saja, hanya merubah string 186
1. Buat sebuah Windows Forms Application project template baru, beri nama CommandObject untuk project tersebut. 2. Tambahkan sebuah Button pada form, ubah nilai properti name nya menjadi btnDataManipulation. 3. Buat connection string di Settings Project terhadap database Northwind seperti yang sudah dilakukan pada lab pembahasan Connection Object. 4. Tambahkan perintah dibawah ini pada baris kode paling atas :
Option Strict On Imports System.Data.SqlClient
187
Catch sqlEx As SqlException MessageBox.Show(sqlEx.ToString) Catch ex As Exception MessageBox.Show(ex.ToString) End Try End Using End Using End Sub
Beberapa properti yang harus di atur nilainya yaitu Connection yang diisi dengan variabel Connection object, CommandType yang diisi sesuai dengan jenis SQL statement yang digunakan apakah itu AdHoc query (Text) atau Stored Procedure, dan CommandText yang diisi dengan perintah SQL atau nama Stored Procedure yang digunakan. Method Command yang digunakan untuk melakukan eksekusi AdHoc query atau stored procedure yaitu ExecuteNonQuery. Prosedur tersebut merupakan sebuah function yang mengembalikan nilai integer yang merepresentasikan jumlah record yang terlibat sebagai hasil dari eksekusi query tersebut.
SqlParameter
Apabila query yang digunakan memiliki input parameter maka object command tersebut membutuhkan SqlParameter apabila database yang digunakannya yaitu SQL Server 7 dan di atasnya. Penggunaan SqlParameter ini dapat digunakan bukan hanya untuk passing input parameter pada query yang disimpan di dalam Stored Procedure melainkan juga dapat digunakan untuk query yang sifatnya Ad-hoc. Selain itu penggunaan SqlParameter ini dapat menghindari terjadinya Sql Injection yang dapat merusak data.
188
1. Tambahkan sebuah button pada form yang telah dibuat sebelumnya. 2. Ubah name properti button tersebut menjadi btnSqlParam. 3. Tambahkan kode berikut pada event click button tersebut :
Private Sub btnSqlParam_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSqlParam.Click Using sqlConn As New SqlConnection(My.Settings.ConnectionStringApp) Using sqlCmd As New SqlCommand sqlCmd.Connection = sqlConn sqlCmd.CommandType = CommandType.Text sqlCmd.CommandText = _ "Update Customers Set City='Bandung',Country = 'Indonesia' Where CustomerID = @id" Dim idParam = New SqlParameter("@id", SqlDbType.NChar) idParam.Value = "Alfki" sqlCmd.Parameters.Add(idParam) 'cara lain untuk passing SqlParameter yaitu 'sqlCmd.Parameters.AddWithValue("@id", "Alfki") Try sqlConn.Open() Dim intRec = sqlCmd.ExecuteNonQuery MessageBox.Show("Updated!...Records Affected : " & intRec.ToString) Catch sqlEx As SqlException MessageBox.Show(sqlEx.ToString) Catch ex As Exception
189
Dari kode diatas dapat dilihat bahwa untuk menggunakan SqlParameter terdapat beberapa alternatif, yang pertama yaitu kita buat terlebih dahulu SqlParameter object nya kemudian ditambahkan pada Parameters collection Command object tersebut. Cara kedua yaitu dapat langsung memanfaatkan method AddWithValue.
1. Buat sebuah stored procedure baru di database Northwind seperti dibawah ini :
CREATE PROCEDURE AddCustomer @id nchar(5), @name nvarchar(40) AS Insert Into Customers (CustomerID,CompanyName) Values (@id,@name)
2. Tambahkan sebuah button pada form yang telah dibuat sebelumnya. 3. Ubah name properti button menjadi btnStoredProc. 4. Tambahkan kode berikut pada event click button tersebut :
190
Private Sub btnStoredProc_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStoredProc.Click Using sqlConn As New SqlConnection(My.Settings.ConnectionStringApp) Using sqlCmd As New SqlCommand sqlCmd.Connection = sqlConn sqlCmd.CommandType = CommandType.StoredProcedure sqlCmd.CommandText = "AddCustomer" sqlCmd.Parameters.AddWithValue("@id", "Rully") sqlCmd.Parameters.AddWithValue("@name", "Native-Enterprise") Try sqlConn.Open() sqlCmd.ExecuteNonQuery() MessageBox.Show("Save!") Catch sqlEx As SqlException MessageBox.Show(sqlEx.ToString) Catch ex As Exception MessageBox.Show(ex.ToString) End Try End Using End Using End Sub
ExecuteNonScalar
Method ini digunakan untuk mengembalikan nilai berupa sebuah record yang hanya memiliki satu kolom dan satu baris. Fungsi ini biasanya digunakan untuk eksekusi Aggregate function seperti Sum,Min,Max,Count, dan Average.
191
Return value dari fungsi ini berupa object sehingga kita harus lakukan konversi ke tipe data yang diinginkan. Berikut adalah contoh program dalam penggunaan fungsi tersebut dimana aggregate function yang digunakan yaitu Sum:
1. Tambahkan sebuah button pada form yang telah dibuat sebelumnya. 2. Ubah name properti button tersebut menjadi btnSum. 3. Tambahkan kode berikut pada event click button tersebut :
Private Sub btnSum_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSum.Click Using sqlConn As New SqlConnection(My.Settings.ConnectionStringApp) Using sqlCmd As New SqlCommand sqlCmd.Connection = sqlConn sqlCmd.CommandType = CommandType.Text sqlCmd.CommandText = _ String.Format("Select SUM(OD.Quantity) From Orders As O Inner Join [Order Details] AS OD" _ & " On O.OrderID = OD.OrderID Where O.CustomerID = '{0}' And OD.ProductID = {1}", "Alfki", 28) Try sqlConn.Open() Dim intTotQty = Convert.ToInt32(sqlCmd.ExecuteScalar) MessageBox.Show("Total Quantity : " & intTotQty.ToString) Catch sqlEx As SqlException MessageBox.Show(sqlEx.ToString) Catch ex As Exception MessageBox.Show(ex.ToString) End Try End Using End Using
192
End Sub
Hasil eksekusi fungsi ExecuteNonScalar diatas yaitu berupa penjumlahan total Quantity ProductID 28 untuk customer Alfki.
Asynchronous Processing
Contoh-contoh kode di atas dilakukan secara synchronous, artinya apabila terdapat lebih dari satu query yang akan dijalankan secara simultan maka salah satu query harus selesai di proses terlebih dahulu untuk melakukan eksekusi query berikutnya. Proses eksekusi query dimungkinkan secara asynchronous. Fitur ini memang sudah disediakan oleh .NET framework itu sendiri. Sehingga satu proses query tidak harus menunggu proses query sebelumnya selesai untuk melakukan eksekusi query berikutnya. Method yang sifatnya asynchronous ditandai dengan awalan Begindan Endmisalnya BeginExecuteReader dan EndExecuteReader. Untuk menggunakan fitur asynchronous maka harus ditambahkan atribut Asynchronous Processing = true didalam connection string yang digunakan. Selain itu juga harus dibuat sebuah prosedur yang nantinya akan di eksekusi apabila prosesnya telah selesai. Method tersebut harus memiliki satu buah input parameter berupa IAsyncResult. Dimana input parameter tersebut nantinya akan digunakan sebagai object yang akan di convert ke tipe semula untuk mengakhiri proses yang sudah selesai dilaksanakan. Untuk menampilkan hasil eksekusi asynchronous ke dalam control yang terdapat didalam form yang sama maka harus digunakan method Invoke form yang bersangkutan. Hal 193
ini diperlukan untuk mengembalikan proses thread yang terpisah ke dalam main thread windows. Berikut di bawah ini ada contoh penggunaan Asynchronous Processing dalam melakukan proses pembacaan dua buah query yang dilakukan secara simultan.
1. Deklarasikan variabel delegate berikut pada form yang sama yang digunakan pada lab sebelumnya :
Private Delegate Sub GetReaderDelegate(ByVal TheDataReader As SqlDataReader)
2. Tambahkan dua control ListBox ke dalam form, ubah properti name nya menjadi lbCustomers dan lbOrders. 3. Buat dua buah prosedur yang digunakan untuk menampilkan hasil ekseskusi query ke dalam kontrol ListBox :
Private Sub GetCustomers(ByVal CustomerReader As SqlDataReader) Dim dt As New DataTable("customers") dt.Load(CustomerReader) lbCustomers.DataSource = dt lbCustomers.DisplayMember = "CompanyName" lbCustomers.ValueMember = "CustomerID" lbCustomers.Refresh() CustomerReader.Close() End Sub
Private Sub GetOrders(ByVal OrdersReader As SqlDataReader) While OrdersReader.Read lbOrders.Items.Add(OrdersReader("OrderID").ToString & OrdersReader("CustomerID").ToString) & "-"
194
4. Buat dua buah prosedur yang nantinya prosedur ini akan dieksekusi apabila prosesnya telah selesai :
Private Sub ProcessingCustomers(ByVal ar As IAsyncResult) Dim cmd As SqlCommand = Nothing Dim dr As SqlDataReader = Nothing Try cmd = DirectCast(ar.AsyncState, SqlCommand) dr = cmd.EndExecuteReader(ar) Me.Invoke(New GetReaderDelegate(AddressOf GetCustomers),New Object() {dr}) Catch ex As Exception If cmd IsNot Nothing Then cmd.Dispose() If dr IsNot Nothing Then dr = Nothing MessageBox.Show("Error from ProcessingCustomers Procedure : " & ex.ToString) End Try End Sub
Private Sub ProcessingOrders(ByVal ar As IAsyncResult) Dim cmd As SqlCommand = Nothing Dim dr As SqlDataReader = Nothing Try cmd = DirectCast(ar.AsyncState, SqlCommand) dr = cmd.EndExecuteReader(ar)
195
Me.Invoke(New GetReaderDelegate(AddressOf GetOrders), New Object() {dr}) Catch ex As Exception If cmd IsNot Nothing Then cmd.Dispose() If dr IsNot Nothing Then dr = Nothing MessageBox.Show("Error from ProcessingOrders Procedure : " & ex.ToString) End Try End Sub
5. Buat sebuah prosedur yang akan melakukan eksekusi dua query sekaligus secara asynchronous :
Private Sub CallCustomersAndOrdersWithoutMARS() Dim connBuilder As New SqlConnectionStringBuilder connBuilder.InitialCatalog = "Northwind" connBuilder.DataSource = ".\sql2008" connBuilder.IntegratedSecurity = True connBuilder.AsynchronousProcessing = True Dim sqlConn1 As New SqlConnection(connBuilder.ToString) Dim cmdCustomers = New SqlCommand cmdCustomers.Connection = sqlConn1 cmdCustomers.CommandType = CommandType.Text cmdCustomers.CommandText = "Select * From Customers" Dim sqlConn2 As New SqlConnection( _ "initial catalog=northwind;data source=.\sql2008;" _ & "integrated security=true;asynchronous processing=true") Dim cmdOrders = New SqlCommand cmdOrders.Connection = sqlConn2
196
cmdOrders.CommandType = CommandType.Text cmdOrders.CommandText = "Select * From Orders" Try sqlConn1.Open() sqlConn2.Open() cmdCustomers.BeginExecuteReader( _ AddressOf ProcessingCustomers, cmdCustomers, CommandBehavior.CloseConnection) cmdOrders.BeginExecuteReader( _ AddressOf ProcessingOrders, cmdOrders, _ CommandBehavior.CloseConnection) Catch ex As Exception If cmdCustomers IsNot Nothing Then cmdCustomers.Dispose() If cmdOrders IsNot Nothing Then cmdOrders.Dispose() If sqlConn1 IsNot Nothing Then sqlConn1.Dispose() If sqlConn2 IsNot Nothing Then sqlConn2.Dispose() Throw New Exception("Error From CallCustomersAndOrders Procedure...", ex) End Try End Sub
6. Tambahkan satu button ke dalam form, ubah properti name nya menjadi btnAsyncProc. 7. Ketikkan kode berikut pada event click button :
Private Sub btnAsyncProc_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAsyncProc.Click
197
Try CallCustomersAndOrdersWithoutMARS() Catch sqlEx As SqlException MessageBox.Show(sqlEx.ToString) Catch ex As Exception MessageBox.Show(ex.ToString) End Try End Sub
Kode diatas dibuat dengan menggunakan dua buah Connection object untuk masing-masing Command object. Karena proses pembacaan data dengan DataReader tidak dapat dilakukan secara bersamaan sehingga masing-masing reader harus memiliki koneksi yang berbeda. .NET 2.0 telah menyediakan fitur MARS (Multiple Active Result Sets). Fitur ini memungkinkan untuk membaca data dengan beberapa DataReader secara simultan yang hanya menggunakan satu koneksi saja. Fitur MARS diaktifkan dengan menambahkan atribut MultipleActiveResultSets = true di connection string nya. Berikut adalah modifikasi kode program sebelumnya yang menggunakan dua koneksi menjadi satu koneksi dengan memanfaatkan fitur MARS :
Private Sub CallCustomersAndOrdersUsingMARS() Dim sqlConn1 As New SqlConnection( _ "initial catalog=northwind;data source=localhost;" _ & "integrated security=true;asynchronous processing=true;MultipleActiveResultSets=true") Dim cmdCustomers = New SqlCommand cmdCustomers.Connection = sqlConn1 cmdCustomers.CommandType = CommandType.Text cmdCustomers.CommandText = "Select * From Customers" Dim cmdOrders = New SqlCommand
198
cmdOrders.Connection = sqlConn1 cmdOrders.CommandType = CommandType.Text cmdOrders.CommandText = "Select * From Orders" Try sqlConn1.Open() cmdCustomers.BeginExecuteReader( _ AddressOf ProcessingCustomers, cmdCustomers) cmdOrders.BeginExecuteReader( _ AddressOf ProcessingOrders, cmdOrders) Catch ex As Exception If cmdCustomers IsNot Nothing Then cmdCustomers.Dispose() If cmdOrders IsNot Nothing Then cmdOrders.Dispose() If sqlConn1 IsNot Nothing Then sqlConn1.Dispose() Throw New Exception("Error From CallCustomersAndOrders Procedure...", ex) End Try End Sub
199
End Sub
DataReader
DataReader merupakan object yang digunakan untuk membaca data. Object ini sifatnya read only dan forward only. Read Only dalam artian object ini tidak dapat digunakan untuk melakukan manipulasi data. Sedangkan Forward Only dalam artian bahwa selama dalam proses pembacaan record maka datareader tersebut tidak dapat melakukan navigasi record ke record sebelumnya yang sudah dibaca. 200
contoh
kode
program
penggunaan
1. Tambahkan Windows Forms Application Project template baru, beri nama DataReaderObject. 2. Tambahkan satu Button, ubah properti name nya menjadi btnUsingReader. 3. Tambahkan ListBox ke dalam form yang sama, ubah properti name nya menjadi lbCustomers. 4. Buat satu buah variabel bertipe ConnectionString pada Settings Project Properties seperti yang sudah dilakukan sebelumnya. Beri nama ConnectionStringApp dan isi sesuai dengan database yang dituju yaitu Northwind beserta informasi lainnya seperti jenis autentikasi. 5. Tambahkan perintah berikut pada baris paling atas di class form tersebut :
Option Strict On Imports System.Data.SqlClient
201
Dim dr As SqlDataReader = Nothing Try sqlConn.Open() dr = sqlCmd.ExecuteReader While dr.Read Dim custID = dr(0).ToString Dim compName = dr("CompanyName").ToString lbCustomers.Items.Add(custID & "-" & compName) End While Catch sqlEx As SqlException MessageBox.Show(sqlEx.ToString) Catch ex As Exception MessageBox.Show(ex.ToString) Finally If dr IsNot Nothing Then dr.Close() If sqlConn IsNot Nothing Then sqlConn.Dispose() End Try End Using End Using End Sub
Untuk membaca data dari datareader dibutuhkan perintah looping While terhadap method Read dari datareader tersebut. Sedangkan untuk membaca data kolom digunakan indexer dengan memberikan index dari urutan kolom yang terdapat didalam query, index ini dimulai dari Nol. Selain itu juga dapat menggunakan nama kolom itu sendiri untuk membaca data kolom tersebut seperti yang dicontohkan pada kode diatas. Berikut adalah contoh penggunaan fitur MARS yang telah saya bahas sebelumnya di lab terdahulu. Skenarionya adalah 202
proses pembacaan data customers dan orders nya sekaligus dengan menggunakan dua datareader dan satu koneksi :
1. Tambahkan satu button kedalam form yang sama, beri nama btnReaderMars. 2. Tambahkan ListBox, beri nama lbCustomerMARS. 3. Buat satu buah variabel bertipe ConnectionString pada Settings Project Properties seperti yang sudah dilakukan sebelumnya. Beri nama MARSConnection dan isi sesuai dengan database yang dituju yaitu Northwind beserta informasi lainnya seperti jenis autentikasi dan setting MARS (lihat lab sebelumnya). 4. Tambahkan kode berikut pada event click button :
Private Sub btnReaderMARS_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnReaderMARS.Click lbCustomerMARS.Items.Clear() Using sqlConn As New SqlConnection(My.Settings.MARSConnection) Using cmdCustomers As New SqlCommand cmdCustomers.Connection = sqlConn cmdCustomers.CommandType = CommandType.Text cmdCustomers.CommandText = "Select CustomerID From Customers" Using cmdOrders As New SqlCommand cmdOrders.Connection = sqlConn cmdOrders.CommandType = CommandType.Text cmdOrders.CommandText = "Select * From Orders Where CustomerID=@id" cmdOrders.Parameters.Add("@id", SqlDbType.NChar, 5) Dim customerReader As SqlDataReader = Nothing
203
Dim orderReader As SqlDataReader = Nothing Try sqlConn.Open() customerReader = cmdCustomers.ExecuteReader While customerReader.Read Dim custID = customerReader("CustomerID").ToString lbCustomerMARS.Items.Add(custID)
cmdOrders.Parameters("@id").Value = custID orderReader = cmdOrders.ExecuteReader While orderReader.Read Dim orderID = orderReader("OrderID").ToString Dim orderDate = Convert.ToDateTime(orderReader("OrderDate")) Dim lines = New String("="c, 20)
lbCustomerMARS.Items.Add(lines & orderID & ", " _ & orderDate.ToString("MMM/dd/yyyy")) lbCustomerMARS.TopIndex = lbCustomerMARS.Items.Count - 1 End While orderReader.Close() End While Catch sqlEx As SqlException If orderReader IsNot Nothing Then orderReader.Close()
204
MessageBox.Show(sqlEx.ToString) Catch ex As Exception If orderReader IsNot Nothing Then orderReader.Close() MessageBox.Show(ex.ToString) Finally If customerReader IsNot Nothing Then customerReader.Close() If sqlConn IsNot Nothing Then sqlConn.Dispose() End Try End Using End Using End Using
End Sub
205
Dengan menggunakan fitur MARS maka kita dapat bekerja dengan lebih dari satu datareader yang bekerja secara bersamaan dengan menggunakan satu koneksi.
Transaction
Transaction merupakan teknik yang digunakan untuk menjaga integritas data agar tidak terdapat data yang tidak valid, seperti misalnya data Orders yang tidak memiliki records di Order Details table untuk salah satu OrderID numbernya. Dengan transaction ini maka semua proses eksekusi query yang dijadikan kedalam satu unit transaction harus success semua atau gagal. Artinya apabila terjadi error dalam sebuah proses query maka proses query sebelumnya yang success akan di rollback dikembalikan lagi ke kondisi sebelumnya, dan query berikutnya yang belum di proses tidak akan pernah di eksekusi. Terdapat dua object ADO.NET yang dapat digunakan untuk melakukan transaction ini yaitu, SqlTransaction (untuk SQL Server 7.0 dan versi diatasnya) dan TransactionScope class. TransactionScope class terdapat di dalam .NET versi 2.0. Untuk menggunakan class ini harus dilakukan referensi terlebih dahulu terhadap System.Transaction.dll. Penggunaan class ini lebih simpel dibandingkan dengan SqlTransaction. Dengan class ini kita tidak perlu secara eksplisit mengatur properti transaction terhadap Command object yang terlibat didalam unit transaction tersebut. Selain itu juga didalam transactionscope class method rollback akan dipanggil secara otomatis apabila terjadi error.
SqlTransaction
206
Berikut dibawah ini adalah contoh program penggunaan SqlTransaction untuk membuat satu unit transaksi yang akan melakukan proses eksekusi dua query yang berbeda.
1. Tambahkan satu buat Windows Forms Application baru, beri nama project tersebut TransactionObject. 2. Tambahkan satu button, beri nama btnSqlTrans. 3. Tambahkan dua radiobutton, ubah name yang pertama menjadi rbSetError dan text menjadi Set Error. Untuk radiobutton yang kedua ubah properti name nya menjadi rbSetSuccess dan properti text nya menjadi Set Success. 4. Tambahkan perintah berikut di baris paling atas :
Option Strict On Imports System.Data.SqlClient
event
Private Sub RadioButtonCheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles rbSetError.CheckedChanged, _ rbSetSuccess.CheckedChanged Dim rButton = DirectCast(sender, RadioButton) If rButton.Name.ToLower.Equals("rbseterror") AndAlso rButton.Checked Then strSQL1 = "Update Customers Set CustomerID = 'ALFRD' Where CompanyName = 'Alfreds Futterkiste'"
207
strSQL2 = "Update [Order Details] Set Quantity = 10 Where OrderID = 10248 And ProductID = 11" ElseIf rButton.Name.ToLower.Equals("rbsetsuccess") AndAlso rButton.Checked Then strSQL1 = "Update Customers Set ContactName = 'Anders' Where CustomerID = 'Alfki'" strSQL2 = "Update [Order Details] Set Quantity = 10 Where OrderID = 10248 And ProductID = 11" End If End Sub
Kode diatas digunakan untuk melakukan simulasi transaksi, dimana radiobutton Set Error dibuat untuk melakukan transaksi yang nantinya akan di rollback karena error dalam pencarian CustomerID sehingga query yang kedua tidak akan pernah dieksekusi. Untuk radiobutton Set Success sebaliknya, yaitu query dibuat agar eksesusi transaksinya sukses.
208
Dim cmdCustomer As New SqlCommand cmdCustomer.Connection = sqlConn cmdCustomer.CommandType = CommandType.Text cmdCustomer.CommandText = strSQL1 Dim cmdOrderDetails As New SqlCommand cmdOrderDetails.Connection = sqlConn cmdOrderDetails.CommandType = CommandType.Text cmdOrderDetails.CommandText = strSQL2 Dim sqlTrans As SqlTransaction = Nothing Try sqlConn.Open() sqlTrans = sqlConn.BeginTransaction(IsolationLevel.Serializable) cmdCustomer.Transaction = sqlTrans cmdOrderDetails.Transaction = sqlTrans cmdCustomer.ExecuteNonQuery() cmdOrderDetails.ExecuteNonQuery() sqlTrans.Commit() MessageBox.Show("Updated!") Catch sqlEx As SqlException sqlTrans.Rollback() MessageBox.Show(sqlEx.ToString) Catch ex As Exception sqlTrans.Rollback() MessageBox.Show(ex.ToString) End Try End Using End Sub
209
Penempatan transaction harus berada di dalam blok TryCatchsehingga apabila terjadi error kita cukup panggil method Rollback untuk mengembalikan data pada kondisi semula. Perintah Commit digunakan untuk menandakan bahwa tidak terjadi error selama proses eksekusi query tersebut.
TransactionScope
Berikut adalah contoh penggunaan TransactionScope class untuk melakukan unit transaksi :
1. Tambahkan satu button kedalam form yang sama, beri nama btnTransScope. 2. Tambahkan referensi pada System.Transaction.dll. 3. Ketikkan kode berikut pada event click button diatas :
Private Sub btnTransScope_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTransScope.Click Using ts As New System.Transactions.TransactionScope() Using sqlConn As New SqlConnection(My.Settings.ConnectionStringApp) strSQL1 = "Update Customers Set ContactName = 'Anders' Where CustomerID = 'Alfki'" strSQL2 = "Update [Order Details] Set Quantity = 10 Where OrderID = 10248 And ProductID = 11" Dim cmdCustomer As New SqlCommand cmdCustomer.Connection = sqlConn cmdCustomer.CommandType = CommandType.Text cmdCustomer.CommandText = strSQL1 Dim cmdOrderDetails As New SqlCommand
210
cmdOrderDetails.Connection = sqlConn cmdOrderDetails.CommandType = CommandType.Text cmdOrderDetails.CommandText = strSQL2 Try sqlConn.Open() cmdCustomer.ExecuteNonQuery() cmdOrderDetails.ExecuteNonQuery() ts.Complete() MessageBox.Show("Updated!") Catch sqlEx As SqlException MessageBox.Show(sqlEx.ToString) Catch ex As Exception MessageBox.Show(ex.ToString) End Try End Using End Using End Sub
Dari kode diatas dapat dilihat bahwa penggunaan TransactionScope class lebih simpel dibandingkan dengan transaksi sebelumnya. Untuk menandakan bahwa transaksi tersebut sukses yaitu dengan dipanggilnya method Complete. Di dalam kode tersebut tidak terdapat perintah Rollback yang dipanggil, karena hal tersebut sudah secara otomatis dipanggil apabila terjadi error.
211
DataSet
Dataset merupakan object ADO.NET yang sifatnya disconnected. Dengan object ini kita dapat membuat aplikasi yang sifatnya offline (tidak selalu terhubung ke database). Data yang disimpan didalam dataset ini sifatnya In Memory data. Dataset dapat dibayangkan sebagai sebuah miniatur database yang merupakan representasi dari database sebenarnya. Komponen yang membentuknya berupa DataTables, dan DataRelations. Didalam DataTables tersebut terdiri dari DataColumns dan DataRows. Sedangkan DataRelations merupakan class yang digunakan untuk menghubungkan antar DataTable yang terdapat di dalam DataSet apabila terdapat sebuah relationship. Terdapat dua jenis DataSet, yaitu UntypedDataSet dan TypedDataSet UntypedDataSet merupakan dataset yang dibuat langsung dari class System.Data.DataSet. Dataset ini sifatnya untyped dikarenakan tidak memiliki schema yang berisi informasi tentang struktur datatable yang terdapat didalam dataset tersebut, seperti misalnya nama kolom, constraint, 212
relationship,dll. Sehingga pengaksesan object-object tersebut dilakukan secara manual dan memungkinkan terjadinya kesalahan pengaksesan object-object yang terdapat didalam dataset. Error hanya dapat diketahui pada saat run time saja, misalnya terjadi kesalahan perujukan nama kolom atau nama datatable. TypedDataset merupakan class yang diturunkan dari System.Data.Dataset class. Class ini sudah merupakan class modifikasi dari baseclass nya. Dengan jenis Dataset ini maka semua kekurangan yang terdapat didalam Untyped Dataset tertutupi semua. Properti seperti nama kolom, nama tabel akan muncul di jendela Intellisense. Hal tersebut terjadi karena jenis dataset ini memiliki schema berupa file .xsd pada saat design time yang berisi informasi tentang struktur datatable yang terdapat di dalam dataset tersebut. Dataset membutuhkan komponen DataAdapter yang merupakan komponen yang memjembatani antara dataset dan sumber data. Selain untuk mengambil data tugas lainnya dari dataadapter yaitu melakukan update data (insert,update,dan delete) yang terjadi didalam dataset ke database.
Untyped Dataset
Berikut adalah UntypedDataset : contoh program penggunaan
1. Buat sebuah Windows Forms Application project baru, beri nama project tersebut UntypedDataset. 2. Tambahkan perintah dibawah ini pada baris kode paling atas :
Option Strict On Imports System.Data.SqlClient
4. Tambahkan sebuah button, beri nama btnLoad. 5. Tambahkan sebuah DataGridVew ke dalam form. 6. Buat sebuah prosedur seperti ini :
Private Sub LoadCustomers() da = New SqlDataAdapter("Select * From Customers", My.Settings.ConnectionStringApp) da.UpdateBatchSize = 0 cb = New SqlCommandBuilder(da) ds = New DataSet da.Fill(ds, "customerdata") DataGridView1.DataSource = ds.Tables("customerdata") 'atau : 'DataGridView1.DataSource = ds.Tables(0) 'atau : 'DataGridView1.DataSource = ds 'DataGridView1.DataMember = "customerdata" End Sub
Prosedur diatas digunakan untuk load data dari tabel customers dengan menggunakan dataadapter untuk ditampung kedalam dataset. Properti UpdateBatchSize digunakan untuk mengatur jumlah query yang terlibat dalama satu kali batch update ke database. Perlu diketahui bahwa apabila didalam dataset terdapat lima record yang dimanipulasi maka akan terdapat 214
juga lima kali round trip ke database untuk melakukan update data tersebut. Dengan merubah nilai properti tersebut menjadi angka nol maka dataadapter akan mengambil jumlah record maksimum yang dimanipulasi. Misalnya di dalam dataset tersebut terdapat sepuluh record yang mengalami manipulasi data maka hanya akan terdapat satu batch pengiriman data ke database untuk kesepuluh record tersebut. Fitur ini baru terdapat di ADO.NET 2.0. CommandBuilder digunakan untuk generate command text yang berhubungan dengan manipulasi data seperti Insert, Update dan Delete. Command text tersebut dihasilkan pada saat run time. Method Fill digunakan untuk menyimpan data yang telah di load ke dalam dataset. Selain itu juga kita dapat memberikan nama datatable yang otomatis akan dibuatkan ketika dataset diisi dengan data. Dari kode diatas dapat dilihat beberapa cara untuk akses datatable yang terdapat didalam dataset. Anda dapat menggunakan nomor index yang menunjukkan urutan datatable yang terdapat didalam dataset sesuai dengan urutan pemanggilan Fill method atau dengan nama datatable tersebut.
215
8. Tambahkan kontrol button, berikan nama btnUpdate, dan ketikkan kode berikut pada event click :
Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Click Try Dim records = da.Update(ds.Tables("customerdata")) MessageBox.Show("Updated " & records.ToString & " record(s).") Catch sqlEx As SqlException MessageBox.Show(sqlEx.ToString) Catch ex As Exception MessageBox.Show(ex.ToString) End Try End Sub
Kode diatas digunakan untuk melakukan update semua perubahan yang terjadi didalam dataset ke database. Method yang digunakan yaitu fungsi Update dengan menyebutkan nama datatable yang akan di update. Fungsi tersebut mengembalikan nilai jumlah record yang dimanipulasi.
9. Tambahkan satu button, beri nama btnCancel dan ketikkan kode berikut pada event click :
Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click Try ds.Tables("customerdata").RejectChanges() Catch ex As Exception MessageBox.Show(ex.ToString) End Try End Sub
216
Dengan memanggil method RejectChanges maka semua perubahan yang terjadi didalam dataset sebelum di commit ke database akan di reset ke keadaan semula.
10. Tambahkan satu button, berikan nama btnGetBuilder, ketikkan kode berikut pada event click :
Private Sub btnGetBuilder_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGetBuilder.Click Try Dim sb As New System.Text.StringBuilder sb.Append("Delete Command : " & vbNewLine) sb.Append(cb.GetDeleteCommand.CommandText & vbNewLine) sb.Append(vbNewLine) sb.Append("Update Command : " & vbNewLine) sb.Append(cb.GetUpdateCommand.CommandText & vbNewLine) sb.Append(vbNewLine) sb.Append("Insert Command : " & vbNewLine) sb.Append(cb.GetInsertCommand.CommandText & vbNewLine) MessageBox.Show(sb.ToString) Catch ex As Exception MessageBox.Show(ex.ToString) End Try End Sub
Kode diatas digunakan untuk menunjukkan perintahperintah CoomandText yang digenerate secara run time oleh CommandBuilder.
11. Tambahkan kode berikut untuk mengetahui proses batch update yang terjadi di dalam dataadapter ketika proses
217
commit semua perubahan data yang terdapat didalam dataset ke database terjadi.
Private Sub da_RowUpdating(ByVal sender As Object, ByVal e As System.Data.SqlClient.SqlRowUpdatingEventArgs) Handles da.RowUpdating Console.WriteLine("Processing : " & e.StatementType.ToString) End Sub Private Sub da_RowUpdated(ByVal sender As Object, ByVal e As System.Data.SqlClient.SqlRowUpdatedEventArgs) Handles da.RowUpdated Console.WriteLine("Records Affected : " & e.RecordsAffected.ToString) End Sub
218
1. 2. 3. 4. 5. 6. 7.
Tambahkan form baru kedalam project yang sama. Tambahkan Combobox, beri nama cboProducts. Tambahkan Textbox, beri nama txtQty. Tambahkan Button, beri nama btnAdd. Tambahkan Datagridview. Tambahkan Button, beri nama btnCheck. Hasil design form dapat dilihat pada gambar dibawah ini :
219
Public Class Products Private strName As String Private intPrice As Integer Public ReadOnly Property ProductName() As String Get Return strName End Get End Property Public ReadOnly Property UnitPrice() As Integer Get Return intPrice End Get End Property
220
Public Sub New(ByVal ProdName As String, ByVal Price As Integer) strName = ProdName intPrice = Price End Sub End Class
Class tersebut nantinya akan digunakan sebagai sumber data control Combobox untuk menampilkan daftar namanama produk beserta harganya.
11. Buat prosedur dibawah ini untuk membuat Datatable secara programmatically. Datatable ini nantinya dijadikan sebagai sumber data untuk Datagridview :
Private Sub CreateOrdersTable()
221
Dim dcName = New DataColumn("ProductName", GetType(String)) dcName.AllowDBNull = False Dim dcPrice = New DataColumn("Price", GetType(Integer)) dcPrice.AllowDBNull = False Dim dcQty = New DataColumn("Qty", GetType(Integer)) dcQty.AllowDBNull = False Dim dcTotal = New DataColumn("Total", GetType(Integer)) dcTotal.Expression = "Price * Qty" dtOrders = New DataTable("Orders") dtOrders.Columns.AddRange(New DataColumn() {dcName, dcPrice, dcQty, dcTotal}) dtOrders.PrimaryKey = New DataColumn() {dcName} DataGridView1.DataSource = dtOrders End Sub
Perhatikan properti Expression yang dimiliki oleh DataColumn. Properti tersebut digunakan untuk membuat kolom yang sifatnya merupakan hasil perhitungan dari kolom-kolom yang lain. 12. Buat prosedur dibawah ini untuk setting tampilan kolom Datagridview yang menampilkan angka :
Private Sub DataGridSettings() DataGridView1.Columns("Price").DefaultCellStyle.Format = "#,##" DataGridView1.Columns("Qty").DefaultCellStyle.Format = "#,##" DataGridView1.Columns("Total").DefaultCellStyle.Format = "#,##"
222
End Sub
13. Panggil ketiga prosedur diatas pada event Load dari form :
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load LoadProducts() CreateOrdersTable() DataGridSettings() End Sub
Prosedur diatas digunakan untuk menambahkan record baru ke datatable yang telah dibuat.
223
Private Sub btnCheck_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCheck.Click If dtOrders.Rows.Count < 1 Then MessageBox.Show("No Orders") Exit Sub End If Dim rowsColl As DataRowCollection = dtOrders.Rows Dim aRow As DataRow Dim sb As New System.Text.StringBuilder For Each aRow In rowsColl sb.AppendFormat("Product : {0}, Qty : {1}, Total : {2}", _ aRow("ProductName").ToString, _ aRow("Qty").ToString(), _ aRow("Total").ToString) sb.Append(vbNewLine) Next MessageBox.Show(sb.ToString) End Sub
Kode diatas digunakan untuk membaca record yang telah masuk ke dalam datatable dengan menggunakan perintah looping for each terhadap koleksi row datatable. Read Write XML dari Dataset
Salah satu kelebihan yang dimiliki oleh dataset yaitu dukungannya terhadap xml cukup baik. Hal ini diwujudkan dengan disediakannya method untuk menulis dan membaca data dari dan ke file xml. Method tersebut yaitu ReadXML dan WriteXML. Selain itu dataset memiliki kemampuan juga untuk menuliskan schema data yang terdapat didalam dataset yang berisi informasi struktur datatable didalamnya. Schema xml sangat berguna untuk validasi data xml sebelum dibaca agar 224
memenuhi aturan yang telah ditetapkan sebelumnya. Hal tersebut diimplementasikan dengan adanya method ReadXMLSchema. Penggunaan file xml yang berasal dari dataset sangat berguna untuk membuat aplikasi yang sifatnya ocassionally connected application, artinya aplikasi tersebut tidak selalu harus terkoneksi ke database, sehingga datanya sementara dapat disimpan didalam file xml. Berikut adalah contoh program untuk menuliskan data yang terdapat didalam dataset yang diambil dari database kedalam file xml dan juga bagaimana caranya membaca data tersebut dari file xml kembali ke dataset. Selain itu juga diberikan contoh penulisan xml schema dan pembacaannya untuk validasi xml file yang dibaca.
1. 2. 3. 4. 5. 6. 7.
Tambahkan form baru kedalam project yang sama. Tambahkan button, beri nama btnLoadData. Tambahkan Datagridview control. Tambahkan button, beri nama btnReadXML. Tambahkan button, beri nama btnWriteXML. Tambahkan button, beri nama btnWriteSchema. Tampilan design form dapat dilihat seperti ini :
225
10. Buat prosedur dibawah ini untuk membaca data dari tabel database yang nantinya disimpan kedalam dataset untuk dituliskan kedalam file xml :
Private Sub LoadCustomers() ds = New DataSet("CustomersDataSet") da = New SqlDataAdapter("Select * From Customers", My.Settings.ConnectionStringApp)
226
Private Sub btnWriteXML_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnWriteXML.Click If ds IsNot Nothing Then ds.WriteXml("C:\customers.xml") Process.Start("C:\customers.xml") Else MessageBox.Show("Load data first") End If End Sub
XML Diffgram
Method WriteXML dan ReadXML diatas menuliskan file xml dan membaca file xml secara keseluruhan, artinya tidak terdapat informasi data-data mana saja yang dimanipulasi. Dataset menyediakan method Diffgram yang digunakan untuk menyimpan data kedalam file xml dengan menyimpan informasi data-data yang dimanipulasi. Selain itu juga kita 228
dapat membaca data dari file xml tersebut hanya untuk datadata yang telah dimanipulasi saja. Method tersebut berguna untuk menyimpan perubahan data secara sementara sebelum akhirnya nanti di upload ke database. Untuk menggunakan fitur tersebut cukup dengan menambahkan mode Diffgram pada write mode dan read mode. Berikut adalah contoh program yang memanfaatkan teknik Diffgram :
1. 2. 3. 4. 5. 6. 7. 8.
Tambahkan form baru kedalam project yang sama. Tambahkan button, beri nama btnLoadData. Tambahkan button, beri nama btnWriteDiffgram. Tambahkan button, beri nama btnSave. Tambahkan button, beri nama btnReadChanges. Tambahkan Combobox, beri nama cboState. Tambahkan dua DataGridView. Atur control seperti yang tampak pada gambar ini :
229
Private Sub LoadCustomersAndWriteXMLSchema() ds = New DataSet("CustomersDataSet") da = New SqlDataAdapter("Select * From Customers", My.Settings.ConnectionStringApp) cb = New SqlCommandBuilder(da) ds = New DataSet da.Fill(ds, "Customers") ds.WriteXmlSchema("C:\customerschema.xml") DataGridView1.DataSource = ds.Tables("Customers") End Sub
13. Tambahkan kode berikut pada event click btnWriteDiffgram. Kode ini digunakan untuk menuliskan data ke file xml dengan mode Diffgram.
Private Sub btnWriteDiffgram_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnWriteDiffgram.Click If ds IsNot Nothing Then ds.WriteXml("C:\customersdiffgram.xml", XmlWriteMode.DiffGram) Process.Start("C:\customersdiffgram.xml")
231
232
Case 1 dv.RowStateFilter DataViewRowState.CurrentRows Case 2 dv.RowStateFilter DataViewRowState.Deleted Case 3 dv.RowStateFilter DataViewRowState.ModifiedCurrent Case 4 dv.RowStateFilter DataViewRowState.ModifiedOriginal Case 5 dv.RowStateFilter DataViewRowState.OriginalRows Case 6 dv.RowStateFilter DataViewRowState.Unchanged End Select Else
= =
= =
= =
DataGridView2.DataSource = dv MessageBox.Show("C:\customers.xml and (or) C:\customerschema.xml file could not be found. Write to XML first.") End If End Sub
Kode diatas digunakan untuk membaca data file xml sesuai dengan RowStateFilter yang diinginkan. Dengan filter tersebut kita dapat mengetahui data-data mana saja yang mengalami manipulasi atau bahkan data original sekalipun kita masih dapat mengetahuinya. Filtering tersebut harus dilakukan lewat object DataView.
Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click If My.Computer.FileSystem.FileExists("C:\customersdiffgram.xml ") AndAlso _ My.Computer.FileSystem.FileExists("C:\customerschema.xml") AndAlso ds IsNot Nothing Then ds.Clear() ds.ReadXmlSchema("C:\customerschema.xml") ds.ReadXml("C:\customersdiffgram.xml", XmlReadMode.DiffGram) Try da.Update(ds.Tables(0)) ds.AcceptChanges() ds.WriteXml("C:\customersdiffgram.xml", XmlWriteMode.DiffGram) Process.Start("C:\customersdiffgram.xml") Catch ex As Exception MessageBox.Show(ex.ToString) End Try Else MessageBox.Show("C:\customers.xml and (or) C:\customerschema.xml file could not be found. Write to XML first.") End If End Sub
Kode diatas digunakan untuk melakukan update terhadap data-data yang dimanipulasi ke database dan ke file xml dengan mode Diffgram.
DataRelation
234
Datarelation digunakan untuk menghubungkan datatabledatatable yang terdapat didalam dataset apabila diantara beberapa table tersebut memilik relationship yang menghubungkan antara primary key dengan foreign key nya. Untuk membuat relation ini dibutuhkan minimal dua datatable dan kolom yang bertindak sebagai primary key dan foreign key. Relation ini berguna dalam hal navigasi record yang memiliki sifat master-details. Berikut adalah contoh program bagaimana caranya menghubungkan dua datatable didalam dataset dan melakukan navigasi record dari master table terhadap child table yang berhubungan. Data diambil dari table Customers dan Orders didalam database Northwind, sehingga nantinya kita dapat melakukan navigasi record untuk melihat data Orders per CustomerID :
1. 2. 3. 4. 5.
Tambahkan form baru kedalam project yang sama. Tambahkan button, beri nama btnLoadData. Tambahkan DataGridView. Tambahkan ListBox. Tampilan design form dapat dilihat seperti dibawah ini:
235
8. Buat prosedur berikut yang digunakan untuk membuat Datarelation antar datatable customers dan orders :
Private Sub LoadCustomerOrders() ds = New DataSet
236
daCust = New SqlDataAdapter("Select CustomerID,CompanyName From Customers", My.Settings.ConnectionStringApp) daCust.MissingSchemaAction = MissingSchemaAction.AddWithKey daCust.Fill(ds, "customers") daOrders = New SqlDataAdapter("Select * From Orders", My.Settings.ConnectionStringApp) daOrders.Fill(ds, "Orders") Dim dcPK As DataColumn = ds.Tables("customers").Columns("customerid") Dim dcFK As DataColumn = ds.Tables("orders").Columns("customerid") dr = New DataRelation("RelCustOrders", dcPK, dcFK)
MissingSchemaAction properti yang dimiliki oleh DataAdapter digunakan untuk menambahkan informasi key yang dimiliki oleh tabel tersebut. 9. Tambahkan kode berikut pada event click btnLoadData:
Private Sub btnLoadData_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoadData.Click LoadCustomerOrders() End Sub
237
Kode tersebut akan dieksekusi ketika user melakukan navigasi pada record yang terdapat di Datagridview dengan mouse atau cursor. Untuk mendapatkan child records digunakan fungsi GetChildRows yang mengembalikan nilai berupa collection of rows dari record hasil filtering yang terdapat didalam master datatable. 238
1. 2. 3. 4. 5. 6.
Tambahkan Combobox, beri nama cboCustomers. Tambahkan button, beri nama btnDataSetFind. Tambahkan button, beri nama btnDataSetSelect. Tambahkan button, beri nama btnDataView. Tambahkan Listbox, beri nama lbOrders. Tampilan design form dapat dilihat seperti dibawah ini:
239
240
10. Ketikkan prosedur berikut ini untuk membuat dataset dan dataview :
Private Sub CreateDataViewAndDataSet() Using da As New SqlDataAdapter("Select * From Orders", My.Settings.ConnectionStringApp) ds = New DataSet dv = New DataView da.MissingSchemaAction = MissingSchemaAction.AddWithKey da.Fill(ds) Dim dsTemp As DataSet = ds.Copy dv.Table = dsTemp.Tables(0) End Using End Sub
11. Panggil kedua prosedur diatas pada event Load dari form :
241
Private Sub Form6_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load LoadCustomers() CreateDataViewAndDataSet() End Sub
242
If IsNumeric(OrderID) Then Dim row = ds.Tables(0).Rows.Find(OrderID) lbOrders.Items.Add(row("CustomerID").ToString & ", " & Convert.ToDateTime(row("OrderDate")).ToLongDateString) End If End Sub
berikut
pada
event
click
Private Sub btnDataSetSelect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDataSetSelect.Click lbOrders.Items.Clear() Dim rows() = ds.Tables(0).Select("CustomerID = '" & cboCustomers.SelectedValue.ToString & "'") If rows.Length > 0 Then For i = 0 To rows.GetUpperBound(0) lbOrders.Items.Add(rows(i).Item("OrderID").ToString & ", " _ & Convert.ToDateTime(rows(i).Item("OrderDate")).ToLongDateStr ing) Next End If End Sub
Typed DataSet
243
Seperti yang telah disinggung sebelumnya bahwa typed dataset merupakan class yang diturunkan dari System.Data.DataSet class dan merupakan hasil modifikasi. Dataset ini memiliki schema berupa file .xsd yang berisi informasi mengenai object-object yang terdapat di dalam dataset tersebut seperti datatable, nama kolom,tipe data kolom, constraint, dll. Semua object tersebut dapat diakses lewat jendela intellisense, sehingga memiliki keuntungan dalam hal terhindar dari run time error karena kesalahan akses member atau object dataset. Dataset ini dapat dibentuk secara manual from the scratch (dari awal) atau menggunakan data wizard. Berikut adalah contoh membuat typeddataset dengan menggunakan wizard :
1. Buat project Windows Forms Application baru, beri nama project tersebut dengan UntypedDataSet. 2. Klik menu Add New Data Source didalam menu Data di toolbar visual studio. 3. Pilih Database sebagai sumber data :
244
4. Pilih connection string yang sesuai dengan instance server yang digunakan. Pilih database Northwind beserta jenis authentikasinya.
245
5. Pilih table Customers, Orders, OrderDetails, dan satu stored procedure CustOrderHist :
246
247
248
8. Drag dan drop customers table dari DataSources window dalam mode DataGridView ke form :
249
250
Dari form diatas dapat dilihat terdapat beberapa komponen yang digenerate secara otomatis yaitu, Navigator control yang digunakan untuk melakukan navigasi record, button untuk melakukan manipulasi data (save, add, delete), TableAdapter yang bertugas untuk mengambil data dari database dan melakukan update data dari dataset ke database. Apabila anda membuka kode form tersebut maka akan terdapat beberapa kode yang dihasilkan seperti kode untuk load data pada even Load form dan kode untuk melakukan update data pada event click button save.
TableAdapter Query
Kita dapat membuat query lain pada tableadapter yang telah terbentuk. Query tersebut digunakan untuk mengambil 251
data dari database. Misalnya kita ingin membuat query yang dapat menampilkan data customers berdasarkan country. Jenis query yang dapat digunakan bukan hanya query yang mengembalikan rows saja, namun juga seperti query yang menghitung nilai pada kolom tertentu dengan fungsi aggregate. Berikut adalah contoh pembuatan query tabledapter yang akan mengambil data customers berdasarkan country dari database northwind.
1. Klik kanan Customers table pada designer Northwind.xsd kemudian pilih menu Add Query. 2. Terdapat beberapa pilihan command type. Anda bisa menggunakan stored procedure yang sudah ada atau membuat stored procedure yang baru. Untuk kali ini pilih Use SQL Statements :
253
5. Berikan nama untuk kedua method yang nantinya akan digunakan seperti dibawah ini :
254
Dari wizard diatas tampak bahwa kita disediakan dua method yaitu Fill method yang digunakan untuk mengambil data dari database dan disimpan di dataset dan satu fungsi yang mengembalikan nilai sebuah datatable yang nantinya akan berisi data sesuai dengan query yang di definisikan sebelumnya.
255
256
8. Tambahkan Toolstrip pada form yang telah dibuat sebelumnya. 9. Tambahkan Toolstriplabel, Toolstripcombobox dan Toolstripbutton pada Toolstrip yang telah ditambahkan kedalam form. Atur tampilannya seperti dibawah ini :
257
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.CustomersTableAdapter.Fill(Me.NorthwindDataSet.Customers ) LoadComboCustomers() End Sub
berikut
pada
event
click
Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click Me.CustomersTableAdapter.FillByCountry(Me.NorthwindDataSet. Customers, ToolStripComboBox1.Text) End Sub
Kode diatas digunakan untuk melakukan proses filtering data berdasarkan country yang dipilih dari toolstripcombobox.
259
End Sub
Kode diatas digunakan untuk load data customers tanpa adanya proses filtering.
Modifikasi kode tersebut dilakukan dengan menambahkan kotak dialog konfirmasi sebelum di save dan juga dengan adanya tambahan exception handling.
kita ingin membuat form input dengan menggunakan lebih dari satu tabel, misalnya dua tabel, antara tabel customers dengan tabel orders, atau bahkan tiga tabel dengan tabel OrderDetail? Hal tersebut tidak sulit untuk dilakukan dengan menggunakan data wizard. Berikut adalah contoh penggunaan Master Detail data dengan menggunakan TypedDataset dimana data yang digunakan berasal dari tabel Customers dan Orders.
1. Tambahkan satu form baru kedalam project yang sama. 2. Drag dan Drop datatabel customers dan orders (tepat berada didalam node customers datatable) ke dalam form dengan merubah terlebih dahulu mode customer datatable menjadi details :
4. Tambahkan tabel Employees dari jendela Server Explorer database Northwind ke dalam Northwind.xsd designer. Datatable employees yang nantinya di hasilkan akan digunakan sebagai sumber data Datagridviewcomboboxcolumn di datagridview orders untuk menampilkan nama employee :
262
5. Lakukan modifikasi pada kolom EmployeeID di datagridview sehingga nantinya data yang ditampilkan bukan data employeeid melainkan firstname namun nilai yang disimpan tetap data employeeid :
263
menjadi
264
7. Ubah DataSource kolom EmployeeID ke Employees table yang terdapat didalam Project Data Sources :
kolom
EmployeeID
menjadi
265
kolom
EmployeeID
menjadi
266
10. Buka source code file form tersebut kemudian lakukan modifikasi pada prosedur save button seperti berikut :
Private Sub CustomersBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles CustomersBindingNavigatorSaveItem.Click Dim confirm = MessageBox.Show("Save Data?", _ "Confirmation", _ MessageBoxButtons.YesNo, MessageBoxIcon.Question) If confirm = Windows.Forms.DialogResult.Yes Then Try Me.Validate() Me.CustomersBindingSource.EndEdit() Me.OrdersBindingSource.EndEdit() Me.TableAdapterManager.UpdateAll(Me.NorthwindDataSet) MessageBox.Show("Data Saved!") Catch ex As Exception MessageBox.Show(ex.Message) End Try End If End Sub
267
1. 2. 3. 4.
Tambahkan satu form kedalam project yang sama. Tambahkan button, beri nama btnGetCustomers. Tambahkan Listbox kedalam form. Buka source kode form, tambahkan kode berikut pada baris kode paling atas :
Private dsNorthwind As New NorthwindDataSet Private taCust As New NorthwindDataSetTableAdapters.CustomersTableAdapter Private taOrdHist As New NorthwindDataSetTableAdapters.CustOrderHistTableAdapter
berikut
pada
event
click
Private Sub btnGetCustomers_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles btnGetCustomers.Click ListBox1.Items.Clear() Dim custRows As NorthwindDataSet.CustomersRow Dim rowsColl As NorthwindDataSet.CustomersDataTable = dsNorthwind.Customers For Each custRows In rowsColl ListBox1.Items.Add(custRows.CustomerID & ", " & custRows.CompanyName) Next End Sub
269
Dari kode diatas dapat kita lihat perbedaan cara akses datarow untyped dataset dengan typed dataset. Pada typed dataset semua member atau object yang terdapat didalam dataset tersebut akan muncul di dalam jendela intellisense sehingga memudahkan kita untuk mengaksesnya tanpa harus diketik secara manual seperti yang dilakukan pada untyped dataset.
1. Tambahkan button ke dalam form yang sama beri nama btnExecGetData. 2. Tambahkan DataGridView ke dalam form. 3. Ketikkan kode berikut untuk event click btnExecSPFill:
Private Sub btnExecSPFill_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles btnExecSPFill.Click Dim custID = InputBox("Masukkan CustomerID", _ & "Find Customer By ID") taOrdHist.Fill(dsNorthwind.CustOrderHist, custID)
270
Method Fill diatas membutuhkan input parameter berupa customerid yang di supply dari InputBox. Berikut adalah contoh kode program untuk eksekusi method GetData dari stored procedure CustOrderHist yang terdapat didalam Typed DataSet :
1. Tambahkan button kedalam form yang sama, beri nama btnExecGetData dan ketikkan kode berikut pada event click :
Private Sub btnExecGetData_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles btnExecGetData.Click Dim custID = InputBox("Masukkan CustomerID", _ & "Find Customer By ID") Dim orderHist As NorthwindDataSet.CustOrderHistDataTable orderHist = taOrdHist.GetData(custID) DataGridView1.DataSource = orderHist End Sub
sebuah
fungsi
yang
271
1. Tambahkan button kedalam form yang sama, beri nama btnFindByID dan ketikkan kode berikut pada event click button tersebut :
Private Sub btnFindByID_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFindByID.Click Dim custID = InputBox("Masukkan CustomerID", _ & "Find Customer By ID") Dim custRow As NorthwindDataSet.CustomersRow = _ dsNorthwind.Customers.FindByCustomerID(custID) If custRow IsNot Nothing Then Dim sb As New System.Text.StringBuilder sb.AppendFormat("Company Name : {0}", custRow.CompanyName) sb.Append(vbNewLine) sb.AppendFormat("City : {0}", custRow.City) sb.Append(vbNewLine) sb.AppendFormat("Country : {0}", custRow.Country) sb.Append(vbNewLine)
272
273
Anda dapat melihat setting tersebut dengan melakukan klik kanan salah satu datatable yang terdapat didalam Northwind.xsd designer kemudian pilih menu Configure. Apabila dataset tersebut hanya digunakan untuk menampilkan data saja maka anda dapat menghilangkan opsi Generate Insert, Update and Delete Statements. Berikut adalah contoh penggunaan Insert method untuk customers tabel :
1. Tambahkan button, beri nama btnAddUsingInsert, dan ketikkan kode berikut untuk event click button tersebut :
Private Sub btnAddUsingInsert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles btnAddUsingInsert.Click Try taCust.Insert("NTV1", "Native-Enterprise 1", _ Nothing, Nothing, Nothing, _ & "Bandung", Nothing, Nothing, "Indonesia", Nothing, _ Nothing) MessageBox.Show("Data Saved!") Catch sqlEx As SqlException MessageBox.Show(sqlEx.ToString) Catch ex As Exception MessageBox.Show(ex.ToString) End Try End Sub
Untuk kolom yang tidak akan di supply nilainya anda cukup memberikan nilai tersebut dengan Nothing. Jumlah kolom yang dijadikan input parameter tergantung dari query yang didefinisikan pada wizard.
274
1. Tambahkan button kedalam form yang sama, beri nama btnInsertRow dan ketikkan kode berikut pada event click button tersebut :
Private Sub btnInsertRow_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles btnInsertRow.Click Dim newRow As NorthwindDataSet.CustomersRow = _ dsNorthwind.Customers.NewCustomersRow newRow.CustomerID = "NTV2" newRow.CompanyName = "Native-Enterprise 2" newRow.City = "Bandung" newRow.Country = "Indonesia" Try dsNorthwind.Customers.AddCustomersRow(newRow) taCust.Update(dsNorthwind.Customers) MessageBox.Show("Data Saved!")
275
Catch sqlEx As SqlException MessageBox.Show(sqlEx.ToString) Catch ex As Exception MessageBox.Show(ex.ToString) End Try End Sub
Berikut adalah hasil akhir design form yang digunakan didalam lab ini :
276