มาทำความรู้จักกับ DataTable กันก่อน
DataTable คือ คลาสตัวหนึ่งที่เก็บไว้ภายใต้เนมสเปสที่ชื่อ System.Data ดังนั้นเวลาจะใช้งาน ต้องทำการ Imports มาก่อนเสมอ
Imports System.Data
ในคลาส DataTable ประกอบไปด้วย property (อยากแปลเป็นภาษาไทยเหมือนกัน) ที่สำคัญสองตัวคือ Columns และ Rows
- Columns คือการประกาศให้ชาวบ้านรู้ว่า เฮ้ย ใน DataTable นี้มีคอลัมน์ชื่อว่าอะไร ประเภทของข้อมูลเป็นอย่างไร เหมือนกับเราสร้างตาราง (Table) แล้วกำหนดคอลัมน์ลงในในตาราง ของฐานข้อมูล
- Rows เป็นส่วนที่ใช้ในการเก็บข้อมูล ซึ่งก็ต้องตรงกับคอลัมน์ที่ประกาศไว้ด้วย
ปุจจฉา แล้วจะสร้าง DataTable จะต้องเขียนคำสั่งอย่างไร ?
วิสัชนา คำสั่งในการสร้าง DataTable ก็ง่ายนิดเดียว ดังนี้
คำสั่งสร้างออบเจ็กต์ DataTable
การสร้างออบเจกต์ของ DataTable แล้วตั้งชื่อตารางว่า "Products"
Dim dt As New Data.DataTable("Products")
การกำหนดคอลัมน์และประเภทของข้อมูล
หลังจาาสร้างออบเจกต์ของ DataTable แล้ว ขั้นต่อไปก็ต้องกำหนดคอลัมน์
เช่น เราต้องการสร้างคอลัมน์ภายใต้ DataTable (dt) ที่สร้างไว้จำนวน 3 คอลัมน์ ประกอบด้วย
รหัสสินค้า ชนิดข้อมูลเป็น String, ชื่อสินค้า ชนิดข้อมูลเป็น String , ราคาสินค้า ชนิดข้อมูลเป็นตัวเลขมีทศนิยม
เขียนคำสั่งดังนี้
dt.Columns.Add("ProductCode", GetType(System.String)) dt.Columns.Add("ProductName", GetType(System.String)) dt.Columns.Add("ProductPrice", GetType(System.Decimal)) ' กำหนดให้ ProductCode มีค่าไม่ซ้ำกัน และเป็น Primary Key dt.Columns( "ProductCode").Unique = true dt.PrimaryKey = New DataColumn() { dt.Columns("ProductCode") }
การเพิ่มแถวข้อมูลเข้าสู่ DataTable
ก่อนอื่นเราต้องประกาศตัวแปร row กำหนดให้เป็นประเภท DataRow ก่อน
Dim row As DataRow
จากนั้นก็ทำการเพิ่มข้อมูลแถวใหม่เข้าไป ตามคอลัมน์ที่ได้สร้างไว้ ดังนี้
row = dt.NewRow() row.Item("ProductCode") = "000001" row.Item("ProductName") = "Computer Note Book" row.Item("Productprice") = 25600.00 dt.Row.Add(row)หากมีแถวอื่น ๆ อีกก็ทำลักษณะเดียวกัน เช่น
row = dt.NewRow() row.Item("ProductCode") = "000002" row.Item("ProductName") = "Laser Jet Printer" row.Item("Productprice") = 3000.00 dt.Row.Add(row)
เราสามารถเขียนได้อีกวิธีในการเพิ่มแถว ลักษณะนี้จะช่วยให้จำนวนบรรทัดลดลง
และเราไม่จำเป็นต้องประกาศตัวแปร Dim row As DataRow เหมือนตัวอย่างการเพิ่มข้อมูลก่อนหน้านี้
dt.Rows.Add(New Object() {"000003", "Web Camera", 450.00})
การค้นหาข้อมูลใน DataTable ภายใต้คอลัมน์ที่เป็น Primary Key
Dim s As String = "000002" 'ข้อมูลที่จะค้นหา Dim foundRow As DataRow = dt.Rows.Find(s) If foundRow IsNot Nothing Then MessageBox.Show(foundRow(0).ToString() & " " & foundRow(1).ToString() & " " & foundRow(2).ToString()) Else MessageBox.Show("A row with the primary key of " & s & " could not be found") End Ifสำหรับการค้นหา เราสามารถใส่ได้ทั้งตัวอักษรพิมพ์ใหญ่หรือพิมพ์เล็กก็ได้ จะได้ค่าเหมือนกัน
การนับจำนวนแถวทั้งหมดใน DataTable
เราสามารถนับจำนวนแถวที่มีอยู่ใน DataTable ด้วยคำสั่ง
Dim TotRows As Integer TotRows = dt.Rows.Count
การก๊อปปี้ DataTable
เราสามารถ copy ข้อมูลพร้อมกับโครงสร้างของ DataTable ได้ด้วยคำสั่ง
.... Dim dt1 As New Data.DataTable("Products_new") dt1 = dt.Copy()
แต่ถ้าต้องการเฉพาะ Structure ก็ต้องใช้ เมธอด Clone เช่น
.... Dim dt1 As New Data.DataTable("Products_new") dt1 = dt.Clone()
'Add New Row
dt.Rows.Add(New Object() {"000003", "Web Camera", 450.00})
ล้างข้อมูลใน DataTable
Dim dt1 As New Data.DataTable("Products_new")
dt1 = dt.Clone() 'Add New Row dt.Rows.Add(New Object() {"000003", "Web Camera", 450.00}) ...
'ทำการล้างข้อมูล ของตาราง Products_New ซึ่งอยู่ภายใต้ dt1
dt1.Clear()
การอ่านแถวทีละแถวทั้งหมดใน DataTable
เราสามารถวนลูปแสดงข้อมูลทั้งหมดใน DataTable ด้วยคำสั่ง
Dim rows() As DataRow = dt.Select() Dim i As Integer For i = 0 To rows.GetUpperBound(0) Messagebox.Show( (rows(i)("ProductCode")) & " " & _ (rows(i)("ProductName")) & " " & _ (rows(i)("Productprice")))
' or
Messagebox.Show( (rows(i)(0)) & " " & _ (rows(i)(1)) & " " & _ (rows(i)(2)))
Next i
การลบแถวใน DataTable
วิธีแรก การลบโดยระบุแถวที่ต้องการลบได้โดยตรง
ออปเจกต์_DataTable.Rows.Remove(แถวที่ต้องการลบ)
เช่น
dt.Rows.Remove(2) ' ลบข้อมูลในแถวที่ 3 -- 0 คือแถวแรก
อีกวิธี คือค้นหาข้อมูล แล้วค่อยลบข้อมูลที่หาพบออก วิธีนี้จะใช้บ่อย
เช่น ต้องการลบข้อมูลรหัส 000002
'Delete Dim s As String = "000002" 'ข้อมูลที่จะค้นหา Dim foundRow As DataRow = dt.Rows.Find(s) If foundRow IsNot Nothing Then If MessageBox.Show("ต้องการลบรายการ" & (foundRow(0).ToString() & _ " " & foundRow(1).ToString() & _ " " & foundRow(2).ToString()), _ "ยืนยัน", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes Then dt.Rows.Remove(foundRow) ' ลบข้อมูล จากแถวที่หาพบ ' ลบเรียบร้อย ' With Me.DataGridView1 ' แสดงสีสลับแถว ' .RowsDefaultCellStyle.BackColor = Color.Azure ' .AlternatingRowsDefaultCellStyle.BackColor = Color.White ' End With ' DataGridView1.DataSource = dt ' นำข้อมูลไปแสดงใน DataGridView ใหม่ End If Else MessageBox.Show("A row with the primary key of " & s & " could not be found") End If
การปรับปรุงข้อมูลใน DataTable
วิธีแรก การแก้ไขข้อมูลในแถวที่ต้องการ
ออปเจกต์_DataTable.Rows(แถวที่ต้องการลบ).Item(คอลัมน์ที่ต้องการแก้ไข)
เช่น ต้องการแก้ไขขัอมูลในแถวที่ 3 ในคอลัมน์ชื่อ ProductName
dt.Rows(2).Item("ProductName") = "Notebook" ' แก้ไขข้อมูลในแถวที่ 3 -- 0 คือแถวแรก
หรือ ถ้าเรารู้ว่าคอลัมน์ ProductName คือคอลัมน์ลำดับที่เท่าไหร่ก็สามารถระบุเป็นตัวเลขได้ เช่น
dt.Rows(2).Item(1) = "Notebook" ' แก้ไขข้อมูลในคอลัมน์ที่ 2 -- 0 คือคอลัมน์แรก
' (ProductName : อ้างอิงจากตอนสร้าง DataTable)
อีกวิธี คือค้นหาข้อมูล แล้วปรับปรุงข้อมูลในแถวที่เราค้นหาพบ วิธีนี้จะใช้บ่อยอีกเช่นกัน
เช่น ค้นหารหัสสินค้า 000002 และแก้ไขข้อมูลชื่อสินค้าเป็น "UPS"
'Search and Replace Dim s As String = "000002" 'ข้อมูลที่จะค้นหา Dim foundRow As DataRow = dt.Rows.Find(s) If foundRow IsNot Nothing Then foundRow.Item("ProductName") = "UPS" 'หรือ -- dt.Rows.Find(s).Item("ProductName) = "UPS" End If Else MessageBox.Show("A row with the primary key of " & s & " could not be found") End If
การหาแถวที่มีการปรับปรุงใน DataTable
เวลาเราทำการปรับปรุงข้อมูลใน DataTable เราอาจมีความจำเป็นต้องการนำข้อมูลเหล่านั้นไปใช้ประโยชน์ ไม่ว่าจะเป็นนำไปปรับปรุงในตาราง SQL Server หรือ อื่น ๆ ๆ ๆ
--- *** ยังไม่จบ *** ---
5 ความคิดเห็น:
บทความมีประโยชน์มากคะ ยกตัวอย่างเข้าใจง่าย ขณะที่อ่านก็ทำตามไปด้วย
ขอบคุณมากนะครับงมมาหลายวันเลย
ขอบคุณค่ะ
อ่านแล้วเข้าใจง่ายมากเลย
^V^
ผมอยากจะถามว่า สมมุตผมมี ข้อมูลใน text file เช่น
aaa,bbb,ccc;
a,b,c;
จะสามารถนำข้อมูลนี้ลงใน data table ได้อย่างไร (vb.net นะครับ)
ผู้รู้ช่วยหน่อยนะครับ
ขอบคุณมากเลยครับ มีประโยชน์มากเลย
แสดงความคิดเห็น