Nine MVP's Blog

04/06/2010

ASP.NET MVC Series I : Foundation of ASP.NET MVC

Filed under: ASP.NET — Nine MVP @ 8:24 pm
  • ASP.NET MVC Series I : Foundation of ASP.NET MVC
  • ASP.NET MVC Series II : ASP.NET MVC Programming Next…..

Developer Skills

  • Intermediate Level

Tools and Languages

แนะนำบทความเรื่อง ASP.NET MVC ซึ่งผู้เขียนตั้งใจเขียนอ้างอิงกับ ASP.NET MVC v2.0 ตัวปัจจุบัน โดยเริ่มต้นกันแต่แรกไปจนจบเนื้อหาที่พอจะทยอยเขียนออกมาได้  ในบทนี้จะแนะนำให้รู้จักกับ MVC Pattern และใช้งาน ASP.NET MVC 2.0 ในเบื้องต้น   และรวมไปถึงการเปรียบเทียบระหว่าง ASP.NET Web Form และ ASP.NET MVC เราควรจะเลือกใช้ตัวไหนในการพัฒนา

Introduction

จะว่าไปแล้วเรากำลังศึกษาวิธีการเขียนโปรแกรมแบบโบราณอยู่ครับ    เพราะ MVC นั้นเป็นทั้ง Arichitectural Pattern และ Design Pattern ที่มีมานานมากสมัยปี คศ. 1979   โดยนาย Trygve Reenskaug พัฒนาตัวนี้ให้ smalltalks บน PARC   ซึ่งเท่าที่ผมศึกษาดูมาคร่าว ๆ ในแพลทฟอร์มอื่น  แทบทุกภาษาจะมี MVC Framework ไว้ให้ใช้    ฝั่ง Java คงไม่ต้องกล่าวถึงเพราะเป็นเจ้าแห่งการ implement pattern เกือบทั้งหมดที่มีอยู่ในโลกบวกกับที่คิดค้นใหม่และเติบโตขึ้น    ส่วนฝั่ง .NET เองก็พัฒนาต่อยอดมาเป็น MVP, MVVM, etc.  แม้กระทั้งภาษาอย่าง PHP ที่เป็น scriptlet ก็ยังมี MVC ให้ใช้กัน โอ้โฮ.. แบบนี้ MVC มันดียังไง แล้วทำไมทุก Platform ต้องมีเจ้านี่ไว้ในระบบ    ในบทความเรื่องนี้เราจะมาคุยกันครับ

จากที่ผ่านมาหลาย ๆ ท่านคงคุ้นเคยกันดีใน Visual Studio  เมื่อกด double click ที่ control ต่าง ๆ แล้วจะสร้าง Event Click ให้ใน Code behind     สิ่งนี้นำพาโปรแกรมเมอร์ทั้งหลายไปทำงานภายใต้ Event ของคอนโทรล หลังจากได้ Click Event แล้ว  งานอะไรคิดอะไรได้ก็โค้ด ๆ เขียนใส่ลงไปทั้งหมด จะประกาศตัวแปร, จะติดต่อ Database, จะเรียก web service, จะวนลูปกี่ร้อยรอบ ทุกอย่างประดังลงไปใน Event Click   ดีหน่อยบางคนใส่ try catch ให้ด้วย    ซึ่งสิ่งที่ทำไปนี้โค้ดทั้งหมดจะไปฝังอยู่รวมกัน      ทำให้ชุดของโค้ดนั้นปนกันระหว่าง Presentation Logic,  Business Logic และ Data Access Logic     หากจะถามว่าผิดหรือไม่ก็คงตอบได้เต็มปากว่าไม่ผิดอะไรครับ เพราะตอบโจทย์ทางลูกค้าคือ งานสำเร็จและคุณรอดตัวได้งานในวันนี้    แต่ทั้งหมดนี้ไม่สามารถแยกแต่ละส่วนงานออกจากกันได้  แก้เพียงงานบางส่วน เช่น เปลี่ยนกฎการตรวจสอบ input data, แก้บิสเนสลอจิกให้ตรวจสอบเพิ่มเติม เป็นต้น ก็อาจจะกระทบทั้งโมดูล กลายเป็นต้อง retest ใหม่ทั้งหมด  และก็แปลได้ว่าทำงานได้คนเดียวและแบ่งงานกันยากลำบาก เพราะตัวระบบที่เขียนไว้นั้นผูกกันจนแน่นนั้นเอง

   รูปที่ 1.  3 Layered Architecture Diagram

จากหลักการด้านบนหลายคนคงพูดว่า งั้นเราแบ่งชั้นของโค้ด (Layered Architecture) ก็ได้ ซึ่งการแบ่งโค้ดออกเป็นเลเยอร์นั้นเป็นการจำแนกโค้ดชุดที่มีความสัมพันธ์ทำหน้าที่เกี่ยวข้องกันไว้ในชั้นเดียวกัน  โดยแยกเป็น Presentation Layer –> Business Logic Layer –> Data Access Layer   ดังรูปที่ 1.  ด้านบน  วิธีนี้ก็ช่วยให้เราลดความสัมพันธ์ของโค้ดที่ยึดติดกันแน่นได้ในระดับนึง   แต่ก็ยังไม่มีเฟรมเวิร์กเข้ามาช่วยในการจัดการชั้น Presentation Layer แต่อย่างใด เนื่องจากการแบ่งกลุ่มโค้ดเป็นชั้น (Layer) นั้นเป็นการออกแบบโครงสร้างหลวม ๆ นั่นเอง   โดยทั้งนี้เราเองก็สามารถใช้ Web Form จัดการงานต่างๆ ใน Presentaion Layer ก็ได้   ซึ่งคล้ายกันสำหรับ MVC จะเป็นเฟรมเวิร์กเข้ามาจัดการในส่วนโครงสร้างของระบบให้เป็นระเบียบเช่นเดียวกับการทำเลเยอร์   และเราเองก็ยังสามารถใช้เลเยอร์เข้ามาผสมกับการใช้งาน MVC เพื่อสร้างความยืดหยุ่นได้อีกเช่นกัน ซึ่งจะอธิบายในบทความตอนต่อไป

What’s The MVC Pattern

   รูปที่ 2.  Model View Control Diagram

MVC เป็นตัวย่อมาจาก Model / View / Control

Model  สำหรับโมเดลนั้นจะประกอบไปด้วยโครงสร้างคลาสข้อมูลของระบบธุรกิจ (Domain Business) เพื่อนำไปใช้งานใน View และ Controller  โดยความสัมพันธ์ระหว่าง View ก็คือการนำข้อมูลไปทำการ render หรือรับ input กลับเข้ามาในระบบ    และความสัมพันธ์ระหว่าง Controller คือเป็นโมเดลข้อมูล input/output สำหรับ Method ใน controller ไม่ว่าจะ Add/Edit/Delete/Detail  และส่งต่อให้ view เพื่อทำการ render อีกที (กรณีท่านที่ชอบ rich domain มักจะออกแบบ business logic และ Repository ไว้ทำงานที่โมเดล)     ในกรณีที่ระบบงานเล็กต้องการความเร็วในการพัฒนาก็ไม่จำเป็นต้องใช้ Model ก็ได้   อาจจะใช้ Controller ไปสั่งการเรียก Data Access Object  เพื่อส่งผลลัพธ์ที่อาจจะเป็น DataSet กลับไปยัง View ได้ตรง ๆ

Viewสำหรับวิวก็คือ User Interface ของระบบนั่นเอง ซึ่งการทำงานในส่วนของวิวนั้นจะอ้างถึงกล่องโมเดล โดยเพื่อทำการค้นหาและดึงข้อมูลขึ้นมาและแสดงข้อมูลออกมาในรูปแบบที่เราได้กำหนดไว้ในวิวนั้น ซึ่งวิวแต่ละวิวขึ้นอยู่กับ Controller จะเรียกใช้เพื่อ render การทำงาน ไม่ว่าจะเป็นวิวแบบ Add/Edit/Delete และ Detail

Controller และสำหรับการทำงานของคอนโทรลเลอร์ เป็นเสมือนตัวกลางที่ทำงานระหว่างโมเดล (Model) และวิว (View)  ซึ่งเจ้าคอนโทรลเลอร์นี้เอง จะทำงานตามรีเควสจากผู้ใช้งาน ซึ่งจะรู้ว่าเมื่อมีการรีเควสโมเดลนี้ ต้องการคอนโทรลเลอร์ตัวไหน แอคชั่นอะไร ภายในแอคชั่นก็จะไปเรียก Model เพื่อทำงานตาม business อีกที จากนั้นเมื่อทำงานเสร็จเช่นการ Update หรือขอดู Detail ก็จะส่ง data ไปยัง view นั้น ๆ กลับไปแสดงผลพร้อมทั้งนำอ๊อปเจ็คที่สำเร็จไปแสดงผล (กรณีของ anemic model เรามักจะเขียน logic และติดต่อดาต้าเบสที่คอนโทรลเลอร์ซึ่งไม่ค่อยจะดีนัก จะแนะนำภายหลัง)

Advantage of MVC Pattern

  • SoC (Separate of Concern) ช่วยให้เราจัดการความยุ่งเหยิงในการพัฒนาออกเป็นสัดส่วนได้แก่ model, view และ controller
  • รองรับการทำ test-driven development (TDD)
  • เหมาะสำหรับงาน web application ซึ่งรูปแบบการพัฒนานี้สามารถรองรับระบบงานใหญ่และการแบ่งงานกันทำงานภายในทีมพัฒนาทุกขนาด
  • ระบบรองรับการขยับขยายเพิ่มเติมในอนาคต

Hello “ASP.NET MVC“

มารู้จักกับ ASP.NET MVC ซึ่งเราเรียกว่าเฟรมเวิร์กก็ได้เนื่องจากไม่ได้เป็นเพียงแค่คอนเซ็ป แต่ทางไมโครซอฟต์มีไลบราลี่มาให้เราติดตั้งและใช้งาน นำไปพัฒนาต่อยอดระบบได้เลย  มาคุยกันอีกรอบถึงความสามารถของ ASP.NET MVC ซึ่งคงความสามารถเดิม ๆ ของ MVC Pattern ไว้ครบถ้วนทั้งเรื่อง

1. Separate of Concern (SoC) ที่ช่วยแยก logic ออกจากกันอย่างเป็นสัดส่วน ทั้ง User Interface, Business Logic, Data Access Logic  หากมือใหม่ ๆ ที่กำลังหัดเขียนโปรแกรม อาจจะเขียนแยก Function/Method ไว้กลับมาใช้งานอีกรอบ (Reuse)

2. Test-Driven Development (TDD) เนื่องจากโครงสร้างของ ASP.NET MVC นั้นได้ถูกออกแบบด้วย INTERFACEBASED Programming ทำให้เราสามารถจำลองข้อมูล (mock object) เพื่อใช้ในการ input/output ใน method, class ที่เราต้องการทดสอบได้  จึงไม่จำเป็นต้องกด Run Debug (F5) เพื่อทำการทดสอบระบบเหมือนกับ ASP.NET Web Form ที่คอยต้อง input data เข้าไปเพื่อทำการทดสอบโค้ด  และข้อดีอีกคือสามารถเปลี่ยน unit-testing framework ที่พัฒนาบน .NET Frameowrk ได้ตามต้องการอีกด้วย

3. Extensible/Plugable Abilities ความสามารถในการต่อเติมขยับขยายระบบ  เนื่องจากคอมโพเน้นท์ของ ASP.NET MVC นั้นได้ถูกพัฒนามาให้เราสามาถแก้ไขเพิ่มเติม หรือหาอะไรมาทดแทนการทำงานก็ได้ เช่นคุณสามารถนำ View Engine มาใช้งานเอง หรือจะกำหนดการทำงานของ URL Routing เอง และอีกมากมาย  ซึ่งเจ้า ASP.NET MVC นั้นรองรับการใช้งานในลักษณะ Dependency Injection (DI) คือการยิงอ๊อปเจคเข้าไปยังคลาสแทนการเรียกใช้ตรง ๆ โดยอ้างอิงจาก Interface Contract   และยังรองรับการทำงานแบบ Inversion of Control (IoC) ซึ่งเป็นการ reverse ของการเรียกใช้อ๊อปเจคนั้นเอง โดยไปอ่านจาก config ที่กำหนดไว้  โดยทั้ง DI/LoC สามารถนำมาใช้งานเข้ากับ ASP.NET MVC ได้ทุกส่วน ซึ่งการใช้งานวิธีการเหล่านี้จะช่วยให้เราแยกเทสระบบได้อย่างอิสระมากขึ้น

4. Modern Web Programming Support เนื่องจากความสามารถของ Routing ใน ASP.NET MVC มาใช้ในการทำ URL Mapping ทำให้ URL ของเรานั้นดูง่ายและไม่ซับซ้อน ตลอดจนยังสามารถซ่อน extension ของไฟล์ (.aspx ) และพวก Query String ทำให้ URL ดูง่ายจดจำง่ายสะอาดตา ซึ่งความสามารถนี้ยังช่วยในการทำ Search Engine Optimize (SEO) และ REpresentational State Transfer (REST) อีกด้วย

5. ASP.NET Programming Model Support อะไร ๆ ที่เคยโค้ดใน ASP.NET Web Form เราก็ยังนำมาใช้งานได้ด้วยเช่นกัน ไม่ว่าจะเป็น asp.net page (.aspx), user control (.ascx) และ master page (.master) nested master page ซึ่งไฟล์เหล่านี้นำมาใช้เป็น View Template นั้นเอง  อีกทั้งการโค้ดที่ใช้ใน View เราจะใช้ in-line expression (<%= %>) ในการควบคุม logic ของ view นั้น ๆ  นอกจากนั้นก็ยังมีการใช้ Server control + template, การทำ data binding, localization และอีกมากมาย  นอกเหนือที่กล่าวมาด้านบนเจ้า ASP.NET MVC ก็ยังใช้ความสามารถอื่น ๆ ของ ASP.NET ได้อย่างครบถ้วนไม่ว่าจะเป็นการทำ
  • forms authentication / windows authentication
  • URL Authorization
  • Membership and Roles
  • output and data caching
  • session and profile state management
  • health monitoring
  • configuration system
  • provider architecture
ลองสรุปฟีเจอร์ ในแต่ละ version กันดูครับ
ASP.NET MVC v1.0 นั้นทางไมโครซอฟต์ได้ออกเวอร์ชั่นเต็มเมื่อ  09/04/2009 โดยมีฟีเจอร์เด่น ๆ ของการทำงานดังนี้
  • ควบคุม HTML ได้ตามที่ต้องการ (หมายถึงเขียนสคริปเองอย่างเยอะ)
  • สามารถนำ AJAX และ jQuery มาใช้งานร่วมกันได้
  • อนุญาติให้เราสร้าง SEO-friendly URLs สำหรับเว็บไซต์ของเรา ช่วยค้นหาจาก search engine
  • ช่วยทำ Test Driven Development (TDD) เป็นไปโดยง่าย
  • มีโปรเจ็คเท็มเพลทสำหรับ ASP.NET MVC

ASP.NET MVC 2.0 เป็นเวอร์ชั่นล่าสุดที่เพิ่งออกมาเมื่อ 12/03/2010  ซึ่งสามารถทำงานได้เหมือน v1.0 และมีความสามารถเพิ่มเติมตลอดจนปรับเปลี่ยนการทำงาน ซึ่งสามารถใช้วิซาร์ดในการอัพเกรดไปเป็น v2.0 ได้เลย

  • Areas: เป็นการอนุญาติให้เราสามารถทำการแบ่งโมดูลงานของระบบออกเป็นส่วน ๆ  ช่วยให้เราสามารถแยกกันทำงานเป็นทีมได้
  • UI Helpers: เมื่อคุณเลือกสร้างวิวแบบ strong typed ตัว helper จะทำการเลือก control สำหรับแสดงผลของโมเดลที่เหมาะสมให้เองตามลักษณะของข้อมูล ช่วยเพิ่มความรวดเร็วในการพัฒนาระบบงาน ตลอดจนเรายังสามารถ customize template เหล่านี้ตามที่ต้องการได้ และนำกลับไปใช้งานได้
  • Asynchronous controllers: สำหรับ ASP.NET MVC v1.0 ยังเป็นปัญหากับการใช้งาน เพราะถ้ามีรีเควสใดทำงานนานมาก ๆ จะต้องรอจนตัวคอนโทรลเลอร์ทำงานเสร็จ จึงจะรับรีเควสใหม่ได้ (แต่สามารถเขียนเพิ่มเติมได้เองในภายหลัง)  สำหรับ v2.0 ทำมาให้แล้ว โดยให้คอนโทรลเลอร์รองรับการทำงานแบบ async ด้วย
  • Server-side validation: เป็นการอนุญาตให้เราสามารถกำหนดกฎในการตรวจสอบข้อมูลของโมเดลได้ ด้วยการกำหนด attribute หรือเขียนเพิ่มเองก็ได้
  • Client-side validation: เมื่อกำหนดให้โค้ดอนุญาติให้ตรวจสอบโมเดลที่ไคลเอนท์ สคริปต่างๆ จะทำ dynamic validation ให้อัตโนมัติ จากแอททริบิ้วต์ที่กำหนดไว้ในโมเดล

Install ASP.NET MVC 2.0 for VS 2008 SP1

  • ถอนการติดตั้ง ASP.NET MVC 2.0 Preview, RC  เอาออกให้หมด
  • จากนั้นทำการดาวน์โหลด ASP.NET MVC 2.0
  • เมื่อได้มาแล้วก็ทำการติดตั้ง แล้วเสร็จจะได้ project template ของ asp.net mvc มาใช้งานใน vs2008 ของเรา

First Look for ASP.NET MVC 2.0

ต่อไปเราจะมาทดลองเขียนใช้งาน ASP.NET MVC กันเบื้องต้นโดยให้เห็นการทำงานอย่างคร่าว ๆ  เปิด VS 2010 หรือ VS 2008 ของคุณขึ้นมาและลุยกันต่อ

1. ไปที่เมนู File –> New –> Project…

2. เลือกตามรูปที่ 3  Visual C# –> Web –> .Net Framework 4 (choose 3.5 for VS2008)–> เลือก ASP.NET MVC 2 Empty Web Application (จะเป็นโปรเจ็คเทมเพลทที่มีโครงสร้างต่าง ๆ มาให้ค่อนข้างครบ) จากนั้นใส่รายละเอียดดังนี้:

  • Name: ASPNETMVC01,
  • Location:[อะไรก็ได้] ,
  • Solution name: ASPNETMVC

     รูปที่ 3. สร้างโปรเจ็ก ASP.NET MVC 2 Web Application

  รูปที่ 4. สร้าง Unit Test Project

3. จากนั้นจะได้โครงสร้างภายในโปรเจ็คดังภาพที่ 4 ด้านล่าง

   รูปที่  5. ผลลัพธ์

ซึ่งจะขออธิบายดังต่อไปนี้

3.1 ASPNETMVC01 Project

    • Content folder คือโฟล์เดอร์ที่เอาไว้เก็บพวก style sheet, image, icon ประมาณนั้น
    • Controllers folder คือโฟล์เดอร์ที่เอาไว้เก็บโดยแยกเก็บเป็น Controller class ที่ใช้ในการสร้าง method ในการควบคุมสั่งงานต่าง ๆ
    • Models folder คือโฟล์เดอร์ที่เอาไว้เก็บพวกกลุ่ม Domain class ต่าง ๆ ที่จะใช้ในการทำงานกับ Controller และ View
    • Scripts folder คือเอาไว้เก็บ javascript, jquery, microsoft script ต่าง ๆ เป็นต้น
    • Views folder คือโฟลเดอร์สำหรับเก็บ View ที่เราจะสร้างขึ้นเพื่อแสดงผล รับค่าต่าง ๆ
      • Account คือ view ที่สร้างอัตโนมัติโดยโปรเจ็คเทมเพลทนี้เท่านั้น ใช้สำหรับ user account เข้าใช้งานระบบ
      • Home คือ default view ตั้งต้น ส่วนมากจะสามารถเข้าสู่ view นี้เป็นหน้าแรก
      • Shared คือ view ที่จะมองเห็นเรียกใช้ได้จาก view อื่น ๆ ครับ เช่น master page เป็นต้น

3.2 ASPNETMVC01.Tests Project  ตัวนี้จะเป็นเทสโปรเจ็คที่เราสร้างไว้ในตอนสร้างโปรเจ็คก่อนหน้านี้ ซึ่งเอาไว้เทส Controller

4. ทดสอบ Run (F5) ดูครับ จะได้ผลลัพธ์ดังนี้

     รูปที่ 6

ข้อแรก ผู้อ่านจะเห็นว่ามีการใช้งาน Master Page ในโปรเจ็คนี้ด้วย

ข้อสอง ผู้อ่านจะเห็นได้ว่า URL ใน Address Bar ของ Browser จะดูเรียบง่าย

    1. http://localhost:63282/
    2. http://localhost:63282/Home/About
    3. http://localhost:63282/Account/LogOn

5. สำหรับ Unit Test Project ที่เราได้สร้างขึ้นมานั้น Visual Studio จะสร้าง Unit-test Method มาให้เป็นตัวอย่างไว้ศึกษา (ไว้ลงรายละเอียดกันในตอนหลัง)  เราสามารถทดสอบรัน Unit Test Projects ด้วยการกด Crlt+R หรือ Crlt+T  หรือไปที่ Menu –> Test –> Run –> Test in current context  จะได้ผลลัพธ์ดังนี้

รูปที่ 7

How ASP.NET MVC work?

รูปที่ 8 โปรเซสการทำงานระหว่าง ASP.NET Web Form กับ ASP.NET MVC

จากรูปคอลัมภ์ด้านซ้ายจะเป็นโปรเซสการทำงานของ ASP.NET Web Form จะพบว่ามีการใช้งาน Page Class และอาศัยการทำงานของ Postback event ซึ่งทำให้การทำงานนั้นมีความซับซ้อน ส่วนคอลัมภ์ด้านขวาจะเป็นโปรเซสการทำงานของ ASP.NET MVC จะเห็นได้ว่าไม่มีการ Postback event ทำให้ดูเรียบง่ายและเมนเทนได้ง่ายกว่า

รูปที่ 9 Sequence Diagram การทำงานของ ASP.NET MVC Request

1. Browser เมื่อผู้ใช้ได้ส่งคำสั่ง request คำสั่งใด ๆ จาก Browser เข้ามา  เช่นขอหยิบยกตัวอย่างด้านบน http://localhost:63282/Home/About

2. URL Routing  จะนำ URL Request ที่ได้ไปแม๊พเข้ากับ pattern ที่ได้กำหนดไว้ใน Global.asax.cs ตั้งแต่ตอนที่ Application_Start() เรียกเมดธอดที่ชื่อว่า RegisterRoutes()  ซึ่งกำหนดค่าเริ่มต้นไว้ดังนี้ {controller}/{action}/{id}  เมื่อเทียบกับรีเควส  Home/About  ก็จะได้ค่า controller = Home, action = About  ดังนั้น RouteHandler จะไปขอ HomeController จาก ControllerFactory และทำการเรียก About Method ใน HomeController ตาม action ที่ร้องขอมา

3. Controller ในเคสนี้ About Action นั้น เป็นแค่การกำหนดค่า ViewData และสั่ง render Views/Home/About.aspx แค่นั้น    แต่ในการทำงานส่วนใหญ่มักจะมีการเรียกใช้ Model เข้ามาทำงานตามไดอะแกรมด้านบน    ซึ่งใน controller จะทำการเรียก Model เพื่อรัน business method ให้ได้ผลลัพธ์กลับออกมา จากนั้นก็ส่ง Data ที่ได้เข้าไป Render เพื่อให้ได้ ViewResult และหา ViewEngine ได้ที่ตั้งค่าเลือกใช้ไว้ ซึ่ง WebFormViewEngine เป็นของที่มีมาให้ใช้งาน

4. View เมื่อเลือก ViewEngine ได้ก็ทำการ Render HTML กลับไปยัง Browser

Conclusion

หวังว่าบทความตอนนี้คงพอช่วยให้เข้าใจถึงคำว่า MVC และ ASP.NET MVC เทคโนโลยีกันบ้างนะครับ ในตอนหน้าเราจะมาลองโค้ดกัน ด้วยการสร้าง ASP.NET MVC แบบง่าย ๆ เพื่อเอาไว้ทำความเข้าใจทั้งเรื่อง Controller, Routing และ View ในขั้นต้นกัน

Reference http://msdn.microsoft.com


 

Chalermpon Areepong Nine (นาย)

Microsoft MVP Thailand ASP.NET

Greatfriends.biz Community Leader

Email : nine_biz-talk.net at hotmail dotcom

Blog : http://nine-biztalk-net.spaces.live.com/blog

03/06/2010

[Article] Database Series : ทดสอบใช้ SQLite 3 กับ .NET Application (Using Sqlite 3 with .NET Application)

Filed under: Database — Nine MVP @ 12:19 pm

Agenda :

  • Database Series : ทดสอบใช้ SQLite 3 กับ .NET Application (Using SQLite 3 with .NET Application)
  • Database Series : มารู้จักกับ OODB กันเถอะ next…

Tools

  1. Visual Studio 2010/2008 ตัวใดก็ได้ใช้ได้เหมือนกัน
  2. SQLite3 Precompiled Library – Database Command-Line เลือกเอา for windows http://www.sqlite.org/sqlite-3_6_23_1.zip
  3. System.Data.SQLite .NET Data Provider (Support VS2008/VS2010) กดเพื่อ download ที่นี่
  4. SQLite Expert Personal Edition (Free) เอาไว้จัดการดาต้าเบสแบบ GUI กดเพื่อ download ที่นี่

Introduce

พอดีมีถามตอบประเด็นในกระทู้ ก็เลยเอ๊ะ!! เจ้า SQLite หากจะใช้งาน Embedded DB ตัวนี้ ต้องทำอย่างไรบ้างน๊ออ เนื่องจากความสามารถของเจ้า SQLite นี้มีชื่อเสียงระบือไกลไม่ต่างกับเจ้า MySql (เป็นที่กล่าวขานกันได้ด้านดี) บทความนี้เป็นเพียงพื้นฐานแนะนำการใช้งานเท่านั้น เพราะผู้เขียนก็ขอทดสอบเพียงแค่นี้

SQLite Embedded Database

ต้องขอบอกว่า SQLite เหมาะกับงานเล็ก ส่วนมากเหมาะจะเอาไปฝังไว้กับพวกอุปกรณ์ hand held ต่าง ๆ   หรือจะทำเป็นดาต้าเบสขนาดย่อม ๆ สำหรับเก็บข้อมูลที่ฝั่ง client ก็ดี ซึ่ง SQLite คือEmbedded Database เป็นระบบ File System ไม่ต้องติดตั้ง ไม่ต้องสตาร์ทเซอร์วิสใดๆ ขึ้นมาทำงาน  รองรับมาตรฐาน SQL-92   มีความรวดเร็วในการทำงานสูง กินเมมโมรี่ต่ำ สามารถทำงานได้หลายแพลทฟอร์ม รองรับการทำ Transaction ไม่ต้องตั้งค่ากำหนดค่าการทำงานอะไร เริ่มต้นก็สร้าง Database/ Table ใช้งานได้เลย

Basic SQLite

1. หลังจากได้ดาวน์โหลดเจ้า Command-Line ในหัวข้อ Tools –> 2. สำหรับสร้าง Database สร้าง Table มาแล้วให้ทำการแตก zip ออกมาจะได้ sqlite3.exe

2. วิธีการใช้งาน ก็ให้เปิด command ขึ้นมาใช้งานโดยไปที่ Start –> Run –> พิมพ์ Cmd กด Enter จากนั้นก็ Dir ไปยัง folder ที่แตกไฟล์ในข้อ 1 ไว้

ดังภาพของผู้เขียนแตก sqlite3.exe ไว้ใน folder SQLiteTest ก็จะใช้คำสั่ง  >Dir SQLiteTest  เข้าไปยังโฟลเดอร์ดังภาพ

3. สร้าง Database แสนง่ายด้วยคำสั่ง C:\SQLiteTest>SQLite3  Customer.db

จะได้คำสั่งรอเตรียมพร้อมสำหรับการสร้าง Table ดังภาพ

4. มาทดลองสร้างเทเบิ้ล และคำสั่ง CRUD พื้นฐานกันดูครับ พิมพ์สคริปเข้าไปตรง ๆ จบสคริปด้วย “;”

    4.1  เปิดการใช้งาน Foreign key ด้วยคำสั่ง

>PRAGMA FOREIGN_KEYS = ON;

จากนั้นพิมพ์ script ตามนี้เพื่อสร้างเทเบิ้ลสำหรับ Customer table และ Address table ซึ่งมี Foreign Key ผูกกันไว้

 

    4.2 ทดสอบคำสั่ง INSERT

ทำการ insert data ลง customer table

ทำการ insert data ลง address table

    4.3 ทดสอบคำสั่ง Select ในแบบต่าง ๆ

Select * from table

Select with Inner Join

 

    4.4 ทดสอบคำสั่ง Update

 

    4.5 ทดสอบคำสั่ง Delete

เมื่อเสร็จสิ้นการใช้งาน ก็พิมพ์คำสั่ง  >.quit เพื่อออกจากการใช้งาน  และเมื่อลองกลับไปดูในโฟลเดอร์ SQLiteTest จะพบไฟล์ customer.db ปรากฎอยู่ดังภาพ

SQLite Database Management Tools

เพื่อความง่ายในการจัดการโครงสร้างและแก้ไขข้อมูลต่าง หลาย ๆ ท่านนิยมที่จะใช้ GUI tool ตามแต่ถนัดของแต่ละท่าน ซึ่งของฟรีมีให้ใช้เยอะมากครับ ไม่ว่าจะเป็นWeb Tool, Application Tool, command-line tool ในหัวข้อนี้ขอแนะนำตัวนี้ครับ SQLite Expert Personal Edition เพียงพอสำหรับใช้พัฒนาและทดสอบครับ ใช้งานง่ายด้วยสิ

   

 

SQLite Database Driver And Test Drive

สำหรับวิธีการเขียนโปรแกรมติดต่อกับ SQLite นั้น มีหลายวิธีเช่นกันทั้ง C/C++, TCL , ODBC, JDBC, ADO.NET ครบทุกค่าย แต่ผู้เขียนได้ลองค้นหา ADO.NET Data Provider สำหรับใช้งานเจ้า SQLite ปรากฎว่าพบกับ SQLite.NET ADO.NET Provider ใน version 1.0.66.0 นี้จะทำงานกับ VS2008/VS2010 ได้ โดย support ทั้ง Typed DataSet Designer, Entity Framework (ยังทำงานไม่ดีนัก)  จึงได้นำมาทดลองใช้งานในบทความนี้

ให้ดาวน์โหลดและทำการติดตั้งได้เลยครับ จากนั้นเปิด Visual Studio ขึ้นมาเพื่อทดสอบเขียนโค้ดเพื่อทำงานกับ Customer.db ที่เราสร้างไว้ในขั้นตอนก่อนหน้านี้

ซึ่งเข้าไปเอา Driver ได้ที่นี่ C:\Program Files (x86)\SQLite.NET\bin\System.Data.SQLite.dll 

ดูรูปแบบของ connection string ได้ที่นี่ http://www.connectionstrings.com/sqlite  ในส่วน sqlite.net

จากนั้นก็เขียน Code ติดต่อ Database ตามปกติ

using System;
using System.Data;
using System.Windows.Forms;
using System.Data.SQLite;

namespace SQLiteTester
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private string constr = @"data source=Customer.db";  //กรณีโปรแกรม exe อยู่ folder เดียวกับ customer.db

        private void Form1_Load(object sender, EventArgs e)
        {
            dataGridView1.DataSource = GetCustomerData().Tables[0];
        }

        public DataSet GetCustomerData()
        {
            using (var conn = new SQLiteConnection(constr))
            {
                var ds = new DataSet();
                using (var da = new SQLiteDataAdapter(
                    "select * from customer c inner join address a on c.id = a.customer_id", conn))
                {
                    da.Fill(ds, "CustomerData");
                    return ds;
                }
            }
        }
    }
}

 

ผลลัพธ์เมื่อกด RUN (F5)

 

ปล. สำหรับภาษาไทยให้ใช้พวก NVARCHAR, NCHAR จะรองรับ unicode language ได้

 


สามารถ download source code ได้ที่นี่

Code Example Download Here!!

 

Chalermpon Areepong Nine (นาย)

Microsoft MVP Thailand ASP.NET

Greatfriends.biz Community Leader

 

Email : nine_biz-talk.net at hotmail dot com

Blog : http://nine-biztalk-net.spaces.live.com/blog

Blog at WordPress.com.