System.data asp.net ไม ม ให ใช using

หลายคนคงเคยใช้ Entity Framework กับ Microsoft SQL Server แล้วแต่มีบางคนที่ต้องการใช้งานกับ MySQL แล้ว Entity Framework มันจะสามารถใช้งานได้ไหมและมีขั้นตอนอย่างไรบ้าง เรามาทำไปพร้อมๆ กันครับ

โค้ดที่ใช้ในบทความนี้สามารถดาวน์โหลดได้จาก GitHub ครับ

Entity Framework คืออะไร ?

Entity Framework คือ Library ที่ช่วยในการจัดการ Database ที่รู้จักกันว่ามันคือ ORM ตัวหนึ่ง แล้ว ORM มันคืออะไร

ORM คืออะไร ?

ORM หรือ Object Relational Mapping คือการ Mapping Table, View และ Stored Procedure ในฐานข้อมูลออกมาเป็น Class เพื่อลดการ Coding เกี่ยวกับ SQL และเพื่อให้มีความยืดหยุ่นต่อการพัฒนา

https://na5cent.blogspot.com/2013/01/orm-object-relational-mapping-java.html

เริ่มต้นกันเลยครับ

2. สร้างโปรเจค

ผมเริ่มจากสร้าง Console App โดยมี Solution ชื่อ EF6MySQL และมี Project ชื่อ EF6MySQL.App ดังรูป

Create Console Application Project

จากนั้นผมสร้าง Class Library Project มาอีกเอาไว้เก็บ Model ต่างๆ ผมใช้ชื่อว่า EF6MySQL.Models ดังรูป

Create Class Library for model classes

อย่าลืมลบไฟล์ Class1.cs ใน EF6MySQL.Models นะครับเนื่องจากเราไม่ได้ใช้ครับ

3. ติดตั้ง Entity Framework Packages ผ่าน NuGet

ไปที่ Tools ->NuGet Package Manager ->Manage NuGet Packages for Solution… เลือก Browse แล้วค้นหาคือว่า “Entity Framework” แล้วเลือกทั้ง 2 Project แล้ว Install เลยครับ

Install Entity Framework via NuGet

ถ้ามีหน้าต่างขึ้นมาก็กด I Accept ครับ

4. Add Referances

คลิกขวาที่ Referances ของ EF6MySQL.Models แล้วเลือก Add Referance… จากนั้นเลือก Browse

ให้ Browse ไปที่

C:\Program Files (x86)\MySQL\MySQL Connector Net 6.9.9\Assemblies\v4.5

เลือกไฟล์ทั้งหมดแล้วกด Add

Path to add MySQL dll

เลือกทั้งหมดแล้วกด OK อีกทีครับ

Add MySQL dll

จากนั้นเปิดไฟล์ App.config แล้วทำการแก้ไข <entityFramework>

...<entityFramework>

<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">  
  <parameters>  
    <parameter value="mssqllocaldb" />  
  </parameters>  
</defaultConnectionFactory>  
<providers>  
  <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>  
  <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />  
</providers>  
</entityFramework>...<configuration> ...

การแก้ไขนี้เพื่อให้เราสามารถใช้งานร่วมกับ MySQL ได้ครับ

5. สร้าง Entity Data Model

ต่อไปจะเป็นการสร้าง Entity Data Model ซึ่งตัวของ Entity Framework จะทำการ Generate ให้เราเองจากการสร้างไฟล์ที่เป็น ADO.NET Entity Data Model ครับ

Create ADO.NET Entity Data Model

ผมตั้งชื่อตามชื่อฐานข้อมูลเลยครับ จะได้จำได้ดี

เลือกแล้วกด Next ครับ

Choose type of model content

เลือก New Connection แล้วเปลี่ยนการ Connection จาก Microsoft SQL Server เป็น MySQL Database ครับ

Change connection to MySQL Database connection

เลือก MySQL Database แล้วกด OK

Choose Data Source

จากนั้นเราจะกรอก Server, Username, Password และเลือกฐานข้อมูลที่จะทำการ Generate Model แล้วกด OK ครับ

Enter Server, Username, Password and Choose Database

เปลี่ยนชื่อให้สวยงามครับ

Choose database connection

เลือก Table ที่ต้องการครับ เปลี่ยนชื่อ Namespace ให้สวยงามแล้วกด Finish ครับ

Choose table for generate to entity data model

Pluralize or singularize generated object names คือการ Generate ให้เป็นแบบที่มีการเติม s, esหรือเปลี่ยนให้อยู่ในรูปของเอกพจน์, พหุพจน์ครับ จะเลือกหรือไม่ก็ได้ครับ

หน้าตาของ Diagram จะเป็นประมาณนี้ครับ

Entity Diagram

เส้นประ คือการทำ Relation กันระหว่างตารางครับ

6. ทดสอบการทำงาน

เมื่อเราทำการ Generate Entity Data Model เสร็จแล้วเราจะมาทดสอบกันว่าที่เรา Generate มานั้นมันสามารถใช้งานได้จริงหรือเปล่าครับ

หัวข้อนี้ผู้เขียนจะสาทิตการใช้ ADO.NET อย่างง่ายที่สุด เมื่อท่านได้คิวรีที่ต้องการแล้วขั้นตอนต่อไปคือเขียนโปรแกรมภาษา C# ใน MSVS2008 ให้ท่านเปิดโปรแกรม MSVS2008 แล้วสร้างโปรเจ็กต์ใหม่ เลือกชนิดเท็มเพลตเป็น Console Application แล้วตั้งชื่อว่า AdoTest01 หรือชื่ออื่นๆ ตามใจชอบตามที่เห็นในภาพ 31-2

System.data asp.net ไม ม ให ใช using

ภาพ 31-2: เลือกชนิดเท็มเพลตเป็น Console Application

เมื่อสร้างโปรเจ็กต์ใหม่แล้วให้ป้อนพิมพ์โค้ดตามในภาพ 31-3 ลงในไฟล์ Program.cs เนื่องจากเป็นโค้ดสั้นๆ เพื่อทดสอบผู้เขียนจึงใส่ทั้งหมดไว้ภายในเมธอด Main เพื่อความสะดวก ในการเขียนโปรแกรมจริงท่านควรจะนิยามคลาสแยกไว้ต่างหาก บรรทัดที่ 1 และ 2 คำสั่ง Using จับรวมเนมสเปสที่จำเป็นต้องใช้สองเนมสเปสคือ System และ System.Data.SqlClient ซึ่งเป็นส่วนหนึ่งของ ADO.NET เพื่อให้โปรแกรมไคลแอนท์สามารถติดต่อกับ SQL2008 ได้

System.data asp.net ไม ม ให ใช using

ภาพ 31-3: โค้ดภาษา C#

บรรทัดที่ 10 ถึง 12 ทำหน้าที่ประกาศและกำหนดค่าให้แก่ตัวแปรชื่อ sqlConnect เป็นข้อความที่จะใช้เพื่อเชื่อมต่อกับเซอฟเวอร์ ท่านจะต้องแก้ไขชื่อเซอฟเวอร์ในบรรทัดที่ 10 ให้เป็นชื่อเซอฟเวอร์ที่ท่านต้องการติดต่อ หรือจะใส่เป็นไอพีแอดเดรสก็ได้เหมือนกัน โค้ดบรรทัดที่ 13 ถึง 18 ประกาศตัวแปรชื่อ sqlCommand ทำหน้าที่เก็บข้อความที่เป็นคิวรีเพื่อดึงข้อมูลจากเซอฟเวอร์ โปรดสังเกตว่าข้อความนี้คือคิวรีที่ผู้เขียนสาธิตการสร้างไว้ในหัวข้อที่ผ่านมา

โค้ดบรรทัดที่ 19 ประกาศตัวแปรชื่อ connection เพื่อใช้ทำหน้าที่เป็นช่องทางติดต่อกับเซอฟเวอร์ โค้ดบรรทัดที่ 20 ประกาศตัวแปรชื่อ command เพื่อใช้ทำหน้าที่เป็นตัวส่งคำสั่งไปยัง SQL2008 โค้ดบรรทัดที่ 21 ประกาศตัวแปรชื่อ dataReader เพื่อใช้ทำหน้าที่อ่านแถวข้อมูลจาก SQL2008

การประกาศตัวแปรทั้งสามนี้ผู้เขียนกำหนดค่าเริ่มต้นเป็น null ไว้ทำให้ไม่มีออพเจ็กต์เกิดขึ้นจริงๆ เป็นเพียงแต่ตัวแปรที่มีชนิดข้อมูลตามระบุ ยกตัวอย่างเช่น dataReader ตอนนี้เป็นเพียงตัวแปรที่มีชนิดข้อมูลหรือไทป์เป็น SqlDataReader ยังไม่มีออพเจ็กต์ที่เป็น SqlDataReader เกิดขึ้นจริงๆ เพราะยังไม่ได้ใช้คำสั่ง new

คำสั่ง new ในบรรทัดที่ 22 ทำหน้าที่สร้างออพเจ็กต์แบบ SqlConnection เพื่อใช้ทำหน้าที่เป็นช่องทางติดต่อกับเซอฟเวอร์ ผู้เขียนส่งค่า sqlConnect ไปเป็นอาร์กิวเมนต์เพราะเมธอดคอนสทรักเตอร์ของคลาสนี้รับพารามิเตอร์เป็นข้อความที่จะใช้เพื่อเชื่อมต่อกับเซอฟเวอร์ คำสั่งบรรทัดที่ 23 เรียกเมธอด Open ของคลาส SqlConnection เพื่อเริ่มต้นเปิดการเชื่อมต่อ

คำสั่ง new ในบรรทัดที่ 24 ทำหน้าที่สร้างออพเจ็กต์แบบ SqlCommand เพื่อใช้ทำหน้าที่เก็บข้อความที่เป็นคิวรีซึ่งจะดึงข้อมูลจากเซอฟเวอร์ ผู้เขียนใส่อาร์กิวเมนต์สองตัวคือ sqlCommand และ connection เพราะเมธอดคอนสทรักเตอร์ของคลาสนี้รับพารามิเตอร์เป็นข้อความที่เป็นคิวรี และออพเจ็กต์ SqlConnection ที่ท่านจะใช้เป็นช่องทางติดต่อกับเซอฟเวอร์

บรรทัดที่ 25 สร้างออพเจ็กต์แบบ SqlDataReader ซึ่งมีวิธีสร้างวิตถารกว่าคลาสอื่นใด เพราะในขณะที่คลาสอื่นๆ สร้างโดยใช้คำสั่ง new และคอนสทรักเตอร์ แต่คลาส SqlDataReader กลับสร้างด้วยการเรียกเมธอด ExecuteReader ของคลาส SqlCommand ท่านสร้างออพเจ็กต์แบบ SqlDataReader ไว้เพื่อทำหน้าที่อ่านแถวข้อมูลแบบเดินหน้าได้ทางเดียว (ย้อนหลังไม่ได้)

เมื่อโปรแกรมทำงานมาถึงบรรทัดที่ 26 นับว่าท่านมีเครื่องมือทั้งหมดที่จำเป็นต่อการเชื่อมต่อกับ SQL2008 และส่งคำสั่งเชื่อมต่อและคิวรีไปแล้ว ตอนนี้จึงพร้อมที่จะอ่านแถวข้อมูลผลลัพธ์ได้โดยใช้เมธอด Read ของออพเจ็กต์ dataReader คำสั่ง while มีไว้เพื่อให้ทำงานซ้ำอ่านแถวข้อมูลไปเรื่อยๆ จนกว่าจะหมด ตราบใดที่ยังมีข้อมูลอยู่เมธอด Read จะให้ค่าบูลีนเป็นจริง เมื่ออ่านไปถึงแถวสุดท้ายแล้ว Read จะให้ค่าบูลีนเป็นเท็จ ท่านสามารถใช้ค่าบูลีนนี้เป็นเงื่อนไขในคำสั่ง while เพื่อให้ยุติการวนซ้ำได้

บรรทัดที่ 27 ถึง 31 อันที่จริงเป็นคำสั่งบรรทัดเดียว ผู้เขียนแยกไว้หลายบรรทัดเพื่อให้ท่านอ่านเข้าใจได้ง่ายขึ้น ทั้งห้าบรรทัดนี้คือการใช้เมธอด WriteLine ของคลาส Console เพื่อพิมพ์แถวข้อมูลที่ได้รับมาจาก SQL2008 ออกบนจอภาพ โปรดสังเกตว่าวิธีอ้างถึงข้อมูลในคอลัมน์ต่างๆ ทำได้โดยใช้ชื่อ dataReader ตามด้วยวงเล็บเหลี่ยม และใส่ชื่อคอลัมน์เป็นสตริง (หรือจะใส่หมายเลขลำดับแทนก็ได้) ไว้ในวงเล็บเหลี่ยม

สุดท้ายบรรทัดที่ 32 เมื่อท่านได้แถวข้อมูลครบหมดแล้ว และไม่จำเป็นต้องติดต่อกับ SQL2008 อีก ให้ปิดการเชื่อมต่อโดยเรียกเมธอด Close ของออพเจ็กต์ connect แล้วจบการทำงาน

เมื่อป้อนพิมพ์และตรวจสอบดีแล้วว่าไม่มีการสะกดให้กดปุ่ม Ctrl+F5 เพื่อรันโปรแกรม ท่านจะเห็นกรอบ cmd ปรากฏขึ้นเหมือนในภาพ 31-4 สิ่งที่แสดงอยู่ใน cmd คือแถวข้อมูลที่เป็นผลลัพธ์ของการคิวรี โปรดสังเกตว่าข้อมูลเหล่านี้เหมือนผลลัพธ์ของคิวรีในหัวข้อก่อนหน้านี้