รายละเอียดของการตอบ ::
จะเอาไปรวมก็ได้ครับ แต่ลองดูตัวอย่างแบบนี้ก่อนนะครับ
ตัวอย่าง :: หน้าเพจ หรือ (form ของ Win App) สำหรับการจัดการ Member ของระบบที่เราเขียนขึ้นมา
อันดับแรกเลย สร้างคลาส CMember ขึ้นมาก่อน ก็จะเป็น class ที่เก็บรายละเอียดของสมาิชิก เช่น ID, วันเกิด, e-mail ...
ส่วน Interface ก็หน้าจะมีการทำงานคร่าวๆ ตามนี้
- การเพิ่มข้อมูล Member
- การแก้ไขข้อมูล Member
- การลบข้อมูล Member
- แสดงข้อมูล Member ทั้งหมด (เช่นออกมาเป็นตารางคร่าวๆ ID, ชื่อ-นามสกุล, กลุ่ม, e-mail)
- แสดงข้อมูล Member รายบุคคล (ข้อมูลทั้งหมดของแต่ละคน)
- จำนวนสมาชิกทั้งหมด
- จำนวนสมาขิกในกลุ่ม
ทีนี้เราก็มาสร้าง class ของ BR ซึ่งก็จะมี function ตามการทำงานข้างบน กรณีที่การทำงานไหนที่มีการ return ค่ามากกว่า 1 record ก็แล้วแต่เลยครับว่าจะ return กลับด้วยอะไร datareader, datatable, List<> ...
- public int AddMember(CMember memberInfo)
- public bool EditMember(CMember memberInfo)
- public bool DeleteMember(int memberID)
- public List<CMember> GetAllMembers()
- public CMember GetMemberInfo(int memberID)
- public int CountAllMembers()
- public int CountMembersInGroup(int groupID)
ใน class ส่วนของ BR นี่แหละ ที่จะเป็นการตรวจสอบข้อมูลต่างๆ ที่ user ใส่มา ก่อนที่จะเอาไปเข้าฐานข้อมูล เช่น ชื่อ-นามสกุล ซ้ำหรือเปล่า e-mail ซ้ำไม๊ ค่าที่ควรจะเป็นตัวเลข ใส่เป็นตัวอักษรมาหรือเปล่า เป็นต้น ก็ถ้าไม่ผ่าน ก็ตอบกลับไปที่ interface ว่า error ได้เลย
หลังจากที่ผ่านแล้ว ก็จะไปเรียก function ใน class ส่วนของ DL อีกที เพื่อทำการบันทึกลงฐานข้อมูล
- public int DBAddMember(CMember memberInfo)
- public bool DBEditMember(CMember memberInfo)
- public bool DBDeleteMember(int memberID)
- public List<CMember> DBGetAllMembers()
- public CMember DBGetMemberInfo(int memberID)
- public int DBCountAllMembers()
- public int DBCountMembersInGroup(int groupID)
ในส่วนของ DL class นี้จะไม่มีการตรวจสอบใดๆ อีก จะมีแต่เรื่องของการเชื่อมต่อฐานข้อมูล และ sql command เท่านั้นเลย เพราะเราได้ทำการตรวจสอบมาแล้วใน class ของ BR
วิธีอย่างที่ยกตัวอย่างมานี้ อาจจะยากในตอนเริ่มแรก แต่ว่าจะป้องกันและทำให้เราสบายในหลายๆ เรื่องภายหลังได้ครับ
- ไม่มั่วตัวเอง ถ้าจับส่วนตรวจสอบเงื่อนไข ก่อน insert ข้อมูลไว้ที่ function เดียวกัน เวลาแก้ไข อาจจะมีโดนกันบ้าง(ตัวแปร) ซึ่งอาจจะทำให้ error ได้ และก็จะเกิดอาการงงตามมา
- class ในส่วนของ DL สามารถนำไปใช้ต่อ ที่ project อื่นๆได้เลย (ก็จะมีแก้ไขแค่เรื่องการเชื่อมต่อ และชื่อ column ของ table และก็ชื่อ table แค่ันั้น) ตรงตามหลัก OOP ซึ่งถ้ารวมกันแบบที่คุณอยากทำ เวลาเอาไปใช้ที่อื่น ก็ต้องไปลบในส่วนตรวจสอบออกก่อน เพราะแต่ละ project ส่วนตรวจสอบก็จะไม่เหมือนกันอยู่แล้ว ก็จะยุ่งยากอีก ดีไม่ดีอาจมีเขียนใหม่ = ='
- class ในส่วนชอง DL จะไม่มีผลกระทบใดๆ มากนักแม้ว่าเอาไปใช้กับ project ใหม่ที่ database เป็นคนละชนิดกัน ทั้งนี้ก็จะเป็นการบังคับไปในตัวเลยว่า sql command ที่คุณต้องใช้นั้นจะต้องเป็น standard ที่ใช้ได้ กับทุกๆ database เวลาเปลี่ยนก็จะไม่มีผลกระทบใดๆ
และถึงแม้ว่าคุณจะใช้ คำสั่ง, function เฉพาะที่มีอยู่ใน database นั้นๆ ก็มีผลกระทบน้อยอยู่ดี เพียงแค่คุณทำเอกสารกำกับไว้ให้ตัวคุณเองรู้ว่า function นี้ใช้ได้เฉพาะกับฐานข้อมูลชนิดนี้เท่านั้น ก็เป็นอันจบ เวลาเปลี่ยนคุณก็แค่หาคำสั่งใหม่ หรือใกล้เคียงมาใช้แทน เช่น
MS SQL query command
select top 10 * from table order by date_time;
Oracle query command
SELECT * FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY key ASC) AS rownumber,
columns
FROM tablename
)
WHERE rownumber <= 10
เป็นต้น ลองศึกษาเพิ่มได้ตาม link นี้ ==>
SQL Command comparation
ลองพิจารณาดูครับ