DataSet2. DataSet
●
DataSet คอ ออบเจกตทถอไดวาเปนหวใจของ
ADO.NET สาหรบการเขาถ!งขอม#ลแบบ
Disconnected เนองจากออบเจกตน&ใชเกบขอม#ลท
โปรแกรมด!งมาจากฐานขอม#ล โดยการทางานกบ
ขอม#ลใน DataSet จะมร#ปแบบเปนเช,งสมพนธ
(Relational) เหมอนการทางานกบฐานขอม#ลโดยตรง
แตเปนอ,สระจากฐานขอม#ล
●
DataSet ยงสามารถใชเกบขอม#ลทอานมาจากเทกซ
ไฟล (Text File) หรอแหลงขอม#ลแบบ XML ไดดวย
K.Warawut DataSet 2
4. DataTable Object
●
คอ ตวแทนของแตละ table ใน DataSet
●
Table จะถ#กรวบรวมไวในคอลเลคชน
DataTableCollection ซ!งเขาถ!งไดโดยเรยกใชพรอพ
เพอรต& Tables ของ DataSet (Default)
For Each tb As DataTable In ds.Tables
TextBox1.Text &= tb.TableName & ControlChars.CrLf
Next
K.Warawut DataSet 4
5. DataColumn Object
●
โครงสรางของแตละ table จะถ#กกาหนดโดย
คอลเลคชน DataColumnCollection ซ!งบรรจ1ออบ
เจกต DataColumn ไว
●
DataColumn คอ ตวแทนของ field หน!งๆ โดยเกบ
ค1ณสมบต,ตางๆ เกยวกบ field น&นไว เชน ชอฟ4ลด
และชน,ดขอม#ลของฟ4ลด เปนตน
K.Warawut DataSet 5
6. DataColumn Object (Cont.)
●
สามารถเขาถ!งคอลเลคชน DataColumnCollection
ไดโดยเรยกใชพรอพเพอรต& Columns ของ
DataTable
For Each f As DataColumn In ds.Tables(“Emp”).Columns
TextBox1.Text &= f.ColumnName & “: “ & f.DataType.ToString & _
ControlChars.CrLf
Next
DataColumn Object จะเกบคณสมบตเกยวกบฟลด แตไมไดเกบขอมลในฟลดไว
การเขาถ%งขอมลในฟลดจะตองใช DataRow Object
K.Warawut DataSet 6
7. DataRow Object
●
DataTable จะเกบขอม#ล record ตางๆ ไวใน
คอลเลคชน DataRowCollection ซ!งบรรจ1ออบเจกต
DataRow ไวต&งแต 0 ออบเจกตข!&นไป โดยแตละออบ
เจกต คอ ตวแทนของ record หน!งๆ
●
การเขาถ!งคอลเลคชน DataRowCollection ใหใช
พรอพเพอรต& Rows ของ DataTable สวนการเขาถ!ง
ขอม#ลแตละ field ใน record ใหใชพรอพเพอรต& Item
ของ DataRow โดยระบ1ชอ field เปนอารก,วเมนต
K.Warawut DataSet 7
8. DataRow Object (Cont.)
For Each row As DataRow In ds.Tables(“Emp”).Rows
TextBox1.Text &= row.Item(“Firstname”) & ControlChars.CrLf
Next
เน(องจากพรอพเพอรต* Item เป,น Default Property ของ DataRow
ดงน*นแทนทจะเขยนวา
row.Item(“Firstname”)
อาจเขยนส*นๆ ได
row(“Firstname”)
K.Warawut DataSet 8
9. การเพ,มขอม#ลเขาไปใน DataSet
●
การเพ,มขอม#ลเขาไปใน DataSet คอ การเพ,ม record
ใหมเขาไปยง table ใน DataSet ซ!งทาไดโดยเรยก
เมธอด NewRow ของ table (DataTable Object) ท
ตองการเพ,ม record เขาไป เมธอดน&จะสราง
ออบเจกต DataRow ข!&นมาใหมและสงคน (Return)
ออบเจกตน&นกลบมาให ดงน&นตองประกาศตวแปร
ออบเจกตชน,ด DataRow เพอรบคาจากเมธอด แลว
กาหนดขอม#ลลงใน field ตางๆ ของ record ผานทาง
ตวแปรดงกลาว ส1ดทายใหเพ,มออบเจกต DataRow
เขาไปในคอลเลคชน DataRowCollection ของ
table
K.Warawut DataSet 9
10. ตวอยาง การเพ,มขอม#ลเขาไปใน
DataSet
'ประกาศตวแปรเพออางอ,งไปยงเทเบ,ล Emp ใน DataSet
Dim tb As DataTable = ds.Tables(“Emp”)
'สรางเรคอรดใหมทมโครงสรางของฟ4ลดตางๆ ตามทกาหนด
'โดยเทเบ,ล Emp แลวใชตวแปร row อางอ,งไปยงเรคอรดใหมน&น
'(เรคอรดใหมยงไมถ#กเพ,มเขาไปในเทเบ,ล Emp)
Dim row As DataRow = tb.NewRow( )
'กาหนดคาใหกบฟ4ลดตางๆ ถาตองการใหเพมลงในฐานขอมลจรงๆ
row(“FirstName”) = “วราว1ฒ,” ตองใชเมธอด Update ของ DataAdapter
row(“LastName”) = “แขงขน”
row(“Title”) = “Teach”
row(“BirthDate”) = #11/21/1974#
'เพ,มเรคอรดใหมเขาไปยงเทเบ,ล Emp ใน DataSet
tb.Rows.Add(row)
11. การแกไขขอม#ลใน DataSet
'ประกาศตวแปรเพออางอ,งไปยงเทเบ,ล Emp ใน DataSet
Dim tb As DataTable = ds.Tables(“Emp”)
'วนล#ปเพอทางานกบขอม#ลพนกงานท&งหมดในเทเบ,ล Emp
For Each row As DataRow In tb.Rows
'ถาพนกงานมชอและนามสก1ลวา “วราว1ฒ, แขงขน”
If row(“FirstName”) = “วราว1ฒ,” And
row(“LastName”) = “แขงขน” Then
'ใหแกไขชอเปน “Warawut”
row(“FirstName”) = “Warawut”
'แกไขนามสก1ลเปน “Khangkhan”
row(“LastName”) = “Khangkhan”
End If คอ การแกไขเรคอรดทมอย#แลวใน DataSet
Next
โดยกาหนดคาใหมใหกบฟ4ลดทตองการ
DataSet 11
12. การลบขอม#ลใน DataSet
●
การลบขอม#ลใน DataSet ทาไดโดยเรยกเมธอด
Delete ของเรคอรด (ออบเจกต DataRow) ท
ตองการลบ ซ!งเรคอรดจะไมถ#กลบออกไปจาก
DataSet จร,งๆ แตจะถ#กกาหนดสถานะ (พรอพเพอรต&
RowState) เปนคา Deleted การเปลยนสถานะของเร
คอรดแทนทจะลบออกจาก DataSet น&ทาให
DataAdapter ร#วาตองลบเรคอรดใดในฐานขอม#ล
เมอเรยกเมธอด Update ของ DataAdapter เพอนา
ขอม#ลจาก DataSet ไปอพเดลลงฐานขอม#ล ซ!งหลง
จากอพเดลฐานขอม#ลแลว เรคอรดน&นจ!งจะถ#กลบออก
ไปจาก DataSet จร,งๆ 12
13. ตวอยาง การลบขอม#ลใน DataSet
'ประกาศตวแปรเพออางอ,งไปยงเทเบ,ล Emp ใน DataSet
Dim tb As DataTable = ds.Tables(“Emp”)
'วนล#ปเพอทางานกบขอม#ลพนกงานท&งหมดในเทเบ,ล Emp
For Each row As DataRow In tb.Rows
'ถาพนกงานมชอและนามสก1ลวา “Warawut Khangkhan”
If row(“FirstName”) = “Warawut” And
row(“LastName”) = “Khangkhan” Then
'ใหลบขอม#ลของพนกงานคนน&นท,&งไป
row.Delete( )
End If
Next
K.Warawut DataSet 13
14. สถานะของเรคอรด
คา ความหมาย
Added เรคอรดถ#กเพ,มเขามาใน DataRowCollection
(พรอพเพอรต& Rows) ดวยเมธอด Add ของ
DataRowCollection ซ!งหลงจากอพเดทขอม#ล
ลงฐานขอม#ลแลว สถานะจะเปลยนไปเปน
Unchanged
Deleted เรคอรดถ#กลบแลว ซ!งหลงจากอพเดลขอม#ลลง
ฐานขอม#ลแลว เรคอรดจะถ#กลบออกไปจาก
DataSet จร,งๆ
Detached เรคอรดถ#กสรางข!&นมา แตยงไมถ#กเพ,มเขาไปใน
DataRowCollection
K.Warawut DataSet 14
15. สถานะของเรคอรด (ตอ)
คา ความหมาย
Modified เรคอรดถ#กแกไขขอม#ล ซ!งหลงจากอพเดท
ขอม#ลลงฐานขอม#ลแลว สถานะจะเปลยนไป
เปน Unchanged
Unchanged เรคอรดไมมการเปลยนแปลงใดๆ ซ!งเปนคาเร,ม
ตนของเรคอรดทเพ,งถ#กอานจากฐานขอม#ลมา
ใสลง DataSet
K.Warawut DataSet 15
16. การผ#ก DataSet เขากบ
คอนโทรลบนฟอรม
●
Data Binding หมายถ!ง การเชอมโยงกนระหวางออบ
เจกตททาหนาทเปน “ผ#จดเตรยมขอม#ล” (Data
Provider) หรอ “แหลงขอม#ล” (Data Source) กบ
ออบเจกตททาหนาทเปน “ผ#ใชขอม#ล” (Data
Consumer) ซ!ง Data Provider ในกรณของเราคอ
เทเบ,ล (ออบเจกต DataTable) ใน DataSet สวน
Data Consumer ไดแกคอนโทรลตางๆ ทใชแสดง
ผลขอม#ล เรยกวา data-bound control
●
Data Consumer หรอทเรยกวา Data-bound
control แบงได 2 ประเภท คอ simple-bound
control และ complex-bound control
16
17. Simple Data Binding
●
อาศยพรอพเพอรต& DataBindings ของคอนโทรลน&น
ในการระบ1การเชอมโยงระหวางพรอพเพอรต&ของ
คอนโทรลกบแหลงขอม#ล
Object.DataBindings.Add(propertyName, dataSource, DataMember)
object คอนโทรลททาหนาทเป!น Data Consumer
propertyName พร"อพเพอร#ตของคอนโทรลทใชทา Data Binding
$
dataSource ออบเจ"กต#ททาหนาทเป!นแหล'งขอมลหร(อ Data Provider
ซ*งปกตเราจะระบ,เทเบลใน DataSet ให-ก-บพารามเตอร#น$
dataMember ช(อฟ/ลด#ในแหล'งขอมลทใชทา DataBinding
TextBox1.DataBindings.Add(“Text”, ds.Table(“Emp”), “FirstName”)
18. Complex Data Binding
●
คอนโทรลบางชน,ด เชน ListBox, ComboBox และ
DataGridView สามารถแสดงขอม#ลจากแหลงขอม#ล
ไดหลายเรคอรดพรอมกน เนองจากคอนโทรลเหลา
น&แสดงขอม#ลในร#ปแบบรายการ (list) หรอในร#ปแบบ
ตาราง
●
การทา Data Binding กบ Complex-Bound Control
น&น จะตองกาหนดออบเจกตทเปนแหลงขอม#ลใหกบ
พรอพเพอรต& DataSource ของคอนโทรล
DataGridView1.DataSource = ds.Table(“Emp”)
ListBox1.DataSource = ds.Table(“Emp”)
ListBox1.DisplayMember = “FirstName”
19. การเลอนไปยงเรคอรดตางๆ
●
การเลอนเรคอรด หมายถ!ง การเปลยนแปลงเรคอรดท
เปนเรคอรดป<จจ1บน โดยเรคอรดป<จจ1บน (Current
Record) คอ เรคอรดทจะถ#กแสดงขอม#ลออกมาใน
Simple-Bound Control
●
ออบเจกต CurrencyManager (ตวจดการเรคอรด
ป<จจ1บน) คอ ออบเจกตทคอยจดจาตาแหนงของ
เรคอรดป<จจ1บนสาหรบแหลงขอม#ลหน!งๆ โดยแตละ
แหลงขอม#ลจะมออบเจกต CurrencyManager เปน
ของตวเอง
K.Warawut DataSet 19
20. การเลอนไปยงเรคอรดตางๆ (ตอ)
●
ออบเจกต CurrencyManager ท&งหมดทสมพนธกบ
แหลงขอม#ลตางๆ ภายในฟอรมจะถ#กจดการผานออบ
เจกต BindingContext ในฟอรมน&น
●
การเขาถ!ง CurrencyManager สาหรบแหลงขอม#ลท
ตองการ ทาไดโดยเรยกใชพรอพเพอรต&
BindingContext ของฟอรม พรอมท&งสงแหลง
ขอม#ลน&นไปเปนอารก,วเมนต
Me.BindingContext(ds.Tables(“Emp”))
คอ การเขาถ!งออบเจกต CurrencyManager ทคอย
จดจาตาแหนงเรคอรดป<จจ1บนในเทเบ,ล Emp
K.Warawut DataSet 20
21. การเลอนไปยงเรคอรดตางๆ (ตอ)
●
เลอนเรคอรด สามารถกาหนดหมายเลขเรคอรดท
ตองการใหเปนเรคอรดป<จจ1บนทพรอพเพอรต&
Position ของ CurrencyManager
●
กาหนดใหเรคอรดแรกเปนเรคอรดป<จจ1บน
Me.BindingContext(ds.Table(“Emp”)).Position = 0
●
กาหนดใหเรคอรดทอย#ถดจากเรคอรดป<จจ1บนเปนเร
คอรดป<จจ1บน
Me.BindingContext(ds.Table(“Emp”)).Position += 1
K.Warawut DataSet 21
22. การเลอนไปยงเรคอรดตางๆ (ตอ)
●
กาหนดใหเรคอรดทอย#กอนหนาเรคอรดป<จจ1บนเปนเร
คอรดป<จจ1บน
Me.BindingContext(ds.Table(“Emp”)).Position -= 1
●
กาหนดใหเรคอรดลาดบท 3 เปนเรคอรดป<จจ1บน
Me.BindingContext(ds.Table(“Emp”)).Position = 2
●
กาหนดใหเรคอรดส1ดทายเปนเรคอรดป<จจ1บน
Me.BindingContext(ds.Table(“Emp”)).Position = _
Me.BindingContext(ds.Table(“Emp”)).Count - 1
K.Warawut DataSet 22
23. เพ,มและลบเรคอรดในแหลงขอม#ลโดยใช
CurrencyManager
●
ออบเจกต CurrencyManager ไมไดมความสามารถ
แคการจดจาและเปลยนตาแหนงเรคอรดป<จจ1บน
เทาน&น ออบเจกตน&ยงใชเพ,มหรอลบเรคอรดในแหลง
ขอม#ลทมนรบผ,ดชอบอย#ไดดวย โดยใชเมธอด
AddNew และ RemoveAt ตามลาดบ
●
เมธอด AddNew จะสรางเรคอรดวางๆ ข!&นมาใน
แหลงขอม#ล พรอมท&งกาหนดใหเรคอรดใหมน&นเปน
เรคอรดป<จจ1บนโดยอตโนมต,
K.Warawut DataSet 23
24. เพ,มและลบเรคอรดในแหลงขอม#ลโดยใช
CurrencyManager (ตอ)
●
เมธอด RemoveAt ตองการอารก,วเมนต 1 ตว คอ
หมายเลขของเรคอรดทจะลบ
'เกบหมายเลขของเรคอรดป0จจบนไวในตวแปร iCurrentRecord
Dim iCurrentRecord As Integer = _
Me.BindingContext(ds.Tables(“Emp”)).Position
'ลบเรคอรดทมหมายเลขต1าแหนงเทากบคาของ iCurrentRecord
Me.BindingContext(ds.Tables(“Emp”)).RemoveAt(iCurrentRecord)
K.Warawut DataSet 24
25. Example:
CurrencyManager Project
K.Warawut DataSet 25
26. การกลนกรองและเรยงลาดบขอม#ลดวย
DataView
●
DataView ทาหนาทกลนกรองขอม#ลใน DataTable
ตามทกาหนด แลวแสดงขอม#ลน&นออกไปใหแก
คอนโทรลทผ#กอย#กบมน นอกจากน&ยงสามารถเพ,ม
ลบ และแกไขเรคอรดใน DataTable ผาน DataView
ไดอกดวย
●
DataView ชวยสราง “ม1มมองขอม#ล” (Data View) ท
แตกตางไปจาก DataTable เชน DataTable อาจ
เกบขอม#ลพนกงานท&งหมดไวโดยเรยงลาดบตามชอ
แตค1ณอาจสราง DataView ข!&นมาครอบ DataTable
น&นโดยใหจดเรยงเรคอรดตามนามสก1ล
K.Warawut DataSet 26
27. สราง DataView
●
โดยสรางออบเจกตของคลาส DataView ใน
เนมสเปซ System.Data ข!&นมา พรอมท&งระบ1
DataTable เปนอารก,วเมนตใหกบคอนสตรคเตอร
ของคลาส เพอใช DataView เปลยนม1มมองขอม#ลใน
DataTable น&น ตวอยาง
Dim dv As New DataView(ds.Tables(“Emp”))
หรออาจสราง DataView ข!&นมากอน แลวคอยระบ1
DataTable ใหทหลงทพรอพเพอรต& Table
Dim dv As New DataView( )
dv.Table = ds.Tables(“Emp”)
K.Warawut DataSet 27
28. กลนกรองและเรยงลาดบขอม#ลใน
DataView
●
เมอสราง DataView ข!&นมาใหมๆ ขอม#ลใน
DataView จะมม1มมองเหมอนกบขอม#ลใน
DataTable ทมนครอบอย#ท1กประการ แตหลง
จากน&นค1ณสามารถเปลยนม1มมองขอม#ลใหกบ
DataView ได โดยใชพรอพเพอรต& เชน RowFilter
และ Sort เปนตน
K.Warawut DataSet 28
29. พรอพเพอรต& RowFilter ของ
DataView
●
กลนกรองใหเหลอเฉพาะเรคอรดทมคาของฟ4ลด City
เทากบ “Seattle”
dv.RowFilter = “City = 'Seattle'”
●
กลนกรองใหเหลอเฉพาะเรคอรดทมคาของฟ4ลด City
เทากบ “Des Moines” แตคาของฟ4ลด State ตองไม
เทากบ “IA”
dv.RowFilter = “City = 'Des Moines' AND
(NOT State = 'IA')”
K.Warawut DataSet 29
30. พรอพเพอรต& RowFilter ของ
DataView (ตอ)
●
กลนกรองใหเหลอเฉพาะเรคอรดทมคาของฟ4ลด City
เทากบ “Seattle”, “Tacoma” หรอ “Blaine”
dv.RowFilter = “City IN ('Seattle',
'Tacoma', 'Blaine')”
●
กลนกรองใหเหลอเฉพาะเรคอรดทมคาของฟ4ลด City
ข!&นตนดวยคาวา “Sea”
dv.RowFilter = “City LIKE 'Sea%'”
K.Warawut DataSet 30
31. พรอพเพอรต& Sort ของ DataView
●
ใหเรยงลาดบตามรหสพนกงาน
dv.Sort = “CustomerID”
●
ใหเรยงลาดบตามชอพนกงาน โดยถาชอซ&ากนให
เรยงลาดบตามนามสก1ล
dv.Sort = “FirstName, LastName”
●
ใหเรยงลาดบตามชอเมองจากมากไปนอย
dv.Sort = “City DESC”
●
ใหเรยงลาดบตามชอรฐจากมากไปนอย แตถาชอรฐ
เหมอนกนใหเรยงลาดบตามชอเมองจากนอยไปมาก
dv.Sort = “State DESC, City” 31
32. Example:
DataViewDemo Project
K.Warawut DataSet 32
34. กาหนดความสมพนธระหวางเทเบ,ลดวย
DataRelation
●
การกาหนดความสมพนธระหวางเทเบ, 2 เทเบ,ลใน
DataSet ทาไดโดยสรางออบเจกต DataRelation
ข!&นมา ซ!งแตละออบเจกตจะเปนตวแทนของความ
สมพนธหน!งๆ
●
การสรางออบเจกต DataRalation น&นจะตองระบ1ชอ
ความสมพนธและฟ4ลด (ออบเจกต DataColumn) ใน
เทเบ,ลท&งสองทใชเชอมโยงขอม#ลจาก 2 เทเบ,ลน&น
เขาดวยกน
K.Warawut DataSet 34
35. การสรางออบเจกต DataRelation
DataRelation(relationName, parentColumn, childColumn)
●
relationName ชอความสมพนธทตองการกาหนด
●
parentColumn ฟ4ลด (ออบเจกต DataColumn)
ใน Parent Table ทเชอมดยงไปยงฟ4ลดใน Child
Table
●
childColumn ฟ4ลด (ออบเจกต DataColumn) ใน
Child Table ทเชอมโยงไปยงฟ4ลดใน Parent Table
K.Warawut DataSet 35
36. ตวอยาง การสรางออบเจกต
DataRelation
'ใชตวแปร parentColumn อางองไปยงฟ#ลด
'CustomerID ในเทเบล Cust
Dim parentColumn As DataColumn =
ds.Tables(“Cust”).Columns(“CustomerID”)
'ใชตวแปร childColumn อางองไปยงฟ#ลด
'CustomerID ในเทเบล Ord
Dim childColumn As DataColumn =
ds.Tables(“Ord”).Columns(“CustomerID”)
'กาหนดความสมพนธชอ CustomerOrders ข()นมา
Dim relation As DataRelation = New
DataRelation(“CustomerOrders”, parentColumn,
childColumn)
K.Warawut DataSet 36
37. เพ,ม DataRelation เขาไปใน
DataRelationCollection
●
เมอสรางออบเจกต DataRelation ข!&นมาแลว จะตอง
เพ,มออบเจกตน&เขาไปในคอลเลคชน
DataRelationCollection ของ DataSet ดวย เชน
ds.Relations.Add(relation)
คอ การเพ,มความสมพนธ (ออบเจกต DataRelation)
ทสรางข!&นเมอคร#น& เขาไปในคอลเลคชน
DataRelationCollection
●
พรอพเพอรต& Relations ของ DataSet จะใหคาเปน
ออบเจกต DataRelationCollection ซ!งเปนคอลเล
คชนทบรรจ1ออบเจกต DataRelation ท&งหมดท
เกยวของกบ DataSet 37
38. การเขาถ!งเรคอรดในอกเทเบ,ลหน!งท
สมพนธกน
●
เมอเพ,มเขาไปใน DataRelationCollection
(พรอพเพอรต& Relations ของ DataSet) เรยบรอย
แลว เมอทางานอย#กบเรคอรดใน Parent Table จะ
สามารถเขาถ!งเรคอรดใน Child Table ทสมพนธกบ
เรคอรดน&นๆ ได โดยเรยกใชเมธอด GetChildRows
ของเรคอรด (ออบเจกต DataRow) น&นพรอมท&งระบ1
ชอความสมพนธเปนอารก,วเมนต
K.Warawut DataSet 38
39. การเขาถ!งเรคอรดในอกเทเบ,ลหน!งท
สมพนธกน (ตอ)
●
เนองจากเรคอรดใน Child Table ทสมพนธกบเร
คอรดหน!งๆ ใน Parent Table อาจมไดหลาย
เรคคอรด ดงน&นเมธอด GetChildRows จ!งให
ผลลพธเปนอารเรยของออบเจกต DataRow
Dim childRows( ) As DataRow
childRows = ds.Table(“Cust”).Rows(0).GetChildRows(“CustomerOrders”)
For Each row As DataRow In childRows
'ในแต'ละรอบ ต-วแปร row จะอางองไปย-งแต'ละเรคอร#ดในเทเบล Orders ทส-มพ-นธ#ก-บเรคอร#ดแรก
'ในเทเบล Customers
Next
K.Warawut DataSet 39
40. การเขาถ!งเรคอรดในอกเทเบ,ลหน!งท
สมพนธกน (ตอ)
●
ในทางกลบกนเราสามารถเขาถ!งเรคอรดใน Parent
Table ทสมพนธกบเรคอรดหน!งๆ ใน Child Table ได
เชนเดยวกน และโดยทวไปเรคอรดดงกลาวใน
Parent Table จะมเพยงเรคอรดเดยว
●
เมธอดทใชเพอการน&คอ GetParentRow (ไมม s) ซ!ง
ใหผลลพธเปนออบเจกต DataRow
Dim row As DataRow =
ds.Table(“Ord”).Rows(0).GetParentRow(“CustomerOrders”)
TextBox1.Text = row(“CompanyName”)
K.Warawut DataSet 40
41. Example:
DataRelation Project
K.Warawut DataSet 41
42. Contact us
Mr.Warawut Khangkhan
● Social Media:
http://www.facebook.com/awarawut (Profile)
http://www.facebook.com/AjWarawut (Learning)
http://twitter.com/awarawut
● Web Site:
http://awarawut.blogspot.com
● E-Mail:
awarawut@hotmail.com
warawut_kha@dusit.ac.th
● Mobile:
083-0698-410