01 ธันวาคม 2553

VB.Net กับ DataTable

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

มาทำความรู้จักกับ 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 นะครับ)
ผู้รู้ช่วยหน่อยนะครับ

ไม่ระบุชื่อ กล่าวว่า...

ขอบคุณมากเลยครับ มีประโยชน์มากเลย

"I Believe in You"

Copyright(c) 2007 - 2022 by Kasem Kamolchaipisit.