โปรแกรมมั่ว พ่อลูกอ่อน
<TableAdapter>เพิ่มความสามารถให้ Table Adapter ด้วย Partial Class

ในบทความพื้นฐาน TableAdapter เราพบว่า Typed Dataset และ Table Adapter นั้น เมื่อ build แล้ว ทาง Visual Studio จะทำการ auto generate ไฟล์ขึ้นมา 1 ไฟล์ ซึ่งในไฟล์นี้จะบรรจุ Classes ต่างๆไว้ให้เราใช้งาน

จากบทความดังกล่าว เราได้สร้าง Typed DataSet ชื่อ dsNorthwind โดยมี DataTable 3 ตัว และมี TableAdapter 3 ตัว คราวนี้เราลองดูรายละเอียดกันครับ



จะเห็นได้ว่าไฟล์ที่ได้จะถูกแบ่งออกเป็น 2 ส่วนใหญ่ๆ ส่วนแรกเป็นส่วนสำหรับ Dataset Class ซึ่งภายใน Class นี้จะเป็น Partial Class ที่มี Property และ Method ต่างๆที่ถูกสร้างขึ้นสำหรับ Typed Dataset ของเราครับ ส่วนนี้ผมขอข้ามไปเพราะไม่เกี่ยวกับบทความนี้

และส่วนที่สองเป็นส่วนของ TableAdapter ซึ่งมีการสร้าง Namespace ออกมาต่างหาก และภายในจะมี Partial Class อยู่ 3 ตัว นั่นก็คือ Partial Class สำหรับ TableAdapter แต่ละตัวที่เราสร้างขึ้นครับ ทีนี้ถ้าลองขยายมันออกมาดูข้างในจะเห็นรายละเอียดต่างๆที่น่าสนใจ แต่เนื่องจากมันเยอะมาก เดี๋ยวเราจะกลับมาดูเฉพาะบางตัวที่เราสนใจทีหลังครับ แต่ที่สำคัญไฟล์ auto-gen นี้ ห้ามเปลี่ยนแปลงแก้ไขเด็ดขาดครับ เพราะอาจทำให้เกิดการผิดพลาดได้และเมื่อมัน auto gen ใหม่ที่เราแก้ไว้ก็จะหายไปอยู่ดี ดังนั้นถ้าเราต้องการเปลี่ยนแปลงอะไรก็ตาม เช่นเปลี่ยน logic ใน Function เราจะสร้าง Partial Class ตัวใหม่และสร้าง Overload function เพื่อเรียกใช้แทน

ก่อนอื่นเริ่มสร้าง Partial Class กันก่อนครับ เริ่มจากสร้าง Class กันก่อน โดยให้ชื่อเหมือนกับ TypedDataset ครับ แต่ว่านามสกุลก็เป็น .vb หรือ .cs ตามระเบียบ



เมื่อได้ dsNorthwind.vb แล้วก็ต้องทำสิ่งสำคัญ 3 อย่างครับ เพื่อให้มันเป็น Partial Class ที่ใช้ร่วมกับ Partial Class ที่ auto-gen สร้างไว้ คือ

1. เข้าไปทำการ Imports TypedDataSet class (ไม่ต้องก็ได้ครับ แต่ Imports ไว้ดีกว่าน่า)
2. เพิ่ม Namespace ให้เป็น Namespace ตัวเดียวกับของ TableAdapter ที่ auto-gen สร้างไว้ ในที่นี้ชื่อ dsNorthwindTableAdapters ครับ
3. สร้าง Partial Class ชื่อเดียวกับ TableAdapter ที่เราต้องการครับ (สังเกตุว่าถ้าเรากำหนด Namespace ไว้ถูกต้อง IDE จะมีลิสต์รายชื่อ TableAdapter มาให้เราเลือกครับ)



ทีนี้เราจะมาลองเขียน Method ซักตัวละกันครับ ปัญหาหนึ่งที่เจอก็คือ เมื่อผมสั่ง Execute Command แล้ว บาง Command เราต้องการ Return Value เพื่อนำมาใช้งานต่อ เช่น ผมสั่ง Insert ข้อมูล 1 row โดยที่ใน Stored Procedure ผมเขียนคำสั่งให้มันคำนวนค่า ID ซึ่งเป็น Primary Keyให้ และ return ID ที่ได้กลับมา แต่ทีนี้ตัว Table Adapter ปกติเมื่อ Execute แล้วมันไม่มี Return Value มาให้ครับ ดังนั้นก็ต้องเขียน Method เพิ่มเอง

ทีนี้จากตัวอย่างที่ทำไว้ ผมเลยเลือก Table Adapter มา 1 ตัว คือ CustOrdersOrdersTableAdapter ซึ่งมี Command หรือ Query เดียว ซึ่งไปเรียก Stored Procedure ชื่อ dbo.CustOrdersOrders



ดังนั้นก็กลับไปแก้ Stored Procedure ก่อนครับ เพราะของเดิมมันไม่มี returnValue แต่เราจะให้มีเพื่อลองดู (คือขี้เกียจเขียน Stored สำหรับ Insert เอามา test ว่างั้นเหอะ) โดยให้มัน return ค่า 20 กล้บมาเสมอครับ

จะเห็นว่าใน TableAdapter ตัวนี้มี Command เดียว ซึ่ง Command นี้มี parameter 2 ตัว ตัวแรกคือ @Return_Value ซึ่งใช้รับค่า return value ครับ เอาละมาลองเขียน Method กันเลย

Partial Class CustOrdersOrdersTableAdapter

     Public Function GetReturnValue(ByVal commandIndex As Integer) As Object
               Return Me.CommandCollection(commandIndex).Parameters(0).Value
     End Function

End Class

สร้าง Partial Class ไว้ภายใน Namespace เดิมนะครับ ทีนี้ Function นี้ก็รับ parameter 1 ตัว ก็คือ Index ของ Command ที่อยู่ใน CommandCollection ที่เราต้องการหาค่า return (ในที่นี้มี Command เดียว จริงๆเราใช้ 0 ไปเลย ไม่ต้องรับ parameter ก็ได้ครับ) ส่วน Paramters นั้นโดยปกติ parameter(0) จะเป็น returnValue อยู่แล้ว ก็ hardcode ไปได้เลย

เสร็จแล้วก็ไปเขียนโค้ดที่หน้า aspx ได้เลยครับ จากนั้นก็ลองรันดู



ก็เรียบร้อยครับ ได้ค่า returnValue = 20 มาถูกต้องครับ

แล้วถ้ากรณีที่ Table Adapter ของเรามี Command หรือ Query มากกว่า 1 ละ ทีแรกผมเข้าใจว่าตัว Query มันจะเรียงตามที่เราเห็นให้หน้า Dataset Designer แต่ปรากฎว่าไม่ใช่ครับ บางทีใน CommandCollection มันเรียงไม่เหมือนกับที่เราเห็นที่หน้า designer ครับ ดังนั้นเพื่อความชัวร์เราก็ต้องไปไล่ไฟล์ auto-gen ดูครับ ว่า Command ที่เราต้องการมี Index เท่ากับเท่าไหร่

ก็ไปดูที่ Partial Class ของ TableAdapter ที่เราสนใจ จากนั้นก็ไล่จนเจอ Private Sub InitCommandCollection() ครับ



แล้วก็ดูว่า Command ที่เราสนใจ มี Index เท่าไหร่ เพื่อตอนเรียกใช้

Function GetReturnValue(ByVal commandIndex As Integer) จะได้ส่ง parameter ได้ถูกครับ

บทความนี้เริ่มยาวละ สำหรับตัวอย่างการสร้าง Overload Method ไว้ต่อตอนหน้าละกันครับ



Create Date : 09 ตุลาคม 2550
Last Update : 10 ตุลาคม 2550 22:21:01 น. 2 comments
Counter : 1380 Pageviews.

 


โดย: kk IP: 210.86.182.238 วันที่: 22 พฤศจิกายน 2550 เวลา:17:34:27 น.  

 


โดย: huhu IP: 210.86.182.238 วันที่: 22 พฤศจิกายน 2550 เวลา:17:37:16 น.  

ชื่อ :
Comment :
  *ใช้ code html ตกแต่งข้อความได้เฉพาะสมาชิก
 

นายจวบ
Location :
กรุงเทพฯ Thailand

[ดู Profile ทั้งหมด]

ฝากข้อความหลังไมค์
Rss Feed

ผู้ติดตามบล็อก : 2 คน [?]




โปรแกรมมั่ว พ่อลูกอ่อน
Group Blog
 
<<
ตุลาคม 2550
 123456
78910111213
14151617181920
21222324252627
28293031 
 
9 ตุลาคม 2550
 
All Blogs
 
Friends' blogs
[Add นายจวบ's blog to your web]
Links
 

 Pantip.com | PantipMarket.com | Pantown.com | © 2004 BlogGang.com allrights reserved.