วันจันทร์ที่ 27 มกราคม พ.ศ. 2557

2.2.15 การติดต่อฐานข้อมูลด้วย ActiveX Data Object

2.2.15 การติดต่อฐานข้อมูลด้วย ActiveX Data Object
การใช้งาน ADO (ActiveX Data Object) กับ MS Excel
ADO หรือ ActiveX Data Object เป็นเทคโนโลยีที่ช่วยให้แอพพลิเคชั่นต่างๆ สามารถเข้าถึงข้อมูลใดๆก็ได้ โดยอาศัยการเชื่อมต่อผ่าน OLE DB ซึ่งเป็นการอินเตอร์เฟสระดับล่าง (เราปล่อยให้ระบบมันไปคุยกันเอาเอง) ที่สามารถเข้าถึงแหล่งข้อมูลได้หลายประเภท ไม่ว่าจะเป็นไฟล์ฐานข้อมูล (DBMS), File System, Text หรือ Graphics รวมไปถึงแหล่งข้อมูลอื่นๆ คุณสมบัติที่ดีเลิศ ประเสริฐศรีของ ADO ก็คือใช้งานง่าย มีกระบวนการติดต่อของแอพพลิเคชั่นน้อย ใช้ทรัพยากรระบบไม่มากมาย หรือ ฟุ่มเฟือยนัก

หลายต่อหลายครั้งที่รับงานเขียนโปรแกรมขนาดเล็กๆเข้ามา ก็ต้องเจอกับการดึงข้อมูลเดิมออกมาใช้งาน โดยส่วนใหญ่ก็มักจะเป็น Access หรือไม่งั้นก็ Excel เป็นหลัก ซึ่งในบทความนี้ ขอกล่าวถึงโปรแกรมยอดนิยมอย่าง Excel ล่ะกัน เพราะผู้ใช้งาน (User) ส่วนใหญ่ ชอบเก็บข้อมูลต่างๆที่ต้องการเอาไว้เป็นประจำ
 ข้อมูลใน MS Excel ช่างเหมือนกับใน MS Access

ผลจากการทำงานของโปรแกรม
ดังนั้นในตัวอย่างงานชิ้นนี้ จะแสดงการเปิดไฟล์ Excel ขึ้นมา เพื่อดูข้อมูลต่างๆใน Work Sheet แต่ละตัว ที่มีอยู่ในไฟล์ MS Excel โดยเลือกนำ ADO มาใช้งาน

อ้างอิง References --> Microsoft ActiveX Data Objects 2.8 Library

เพิ่ม Component เข้ามาอีก 2 ตัว คือ Common Dialog และ Hierarchical Flex Grid Control
ในตัวอย่างนี้ บางส่วนผมก็ได้ทำการแทรกแนวทางของการทดสอบหาข้อผิดพลาด หรือ ที่เราเรียกว่า Trap Error
Option Explicit
Dim Conn As ADODB.Connection
' ฟังค์ชั่นที่ใช้ในการเปิดไฟล์ MS Excel
' และคืนค่ากลับ "จริง" หรือ "เท็จ" เพื่อแจ้งสถานะของการติดต่อไฟล์ด้วย
Private Function Connect() As Boolean
On Error GoTo ErrorHandler
    Set Conn = New ADODB.Connection
    With Conn
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Data Source=" & txtPathNameXLS.Text & ";Extended Properties=Excel 8.0;"
        .Open
    End With
      ' แสดงว่าสามารถเปิดไฟล์ MS Excel ได้ (หรือ Connect - เชื่อมต่อได้) ก็แจ้งกลับด้วยสถานะที่เป็นจริง
    Connect = True
ExitProc:
    Exit Function
ErrorHandler:
    ' แจ้งสถานะของความผิดพลาด (Trap Error)
    ' เทคนิคการเขียนโปรแกรมของผมครับ ตรง Title MsgBox --> "Error: ฟังค์ชั่น Connect" ก็คือ
    ' ให้มันแจ้งการเกิด Error ในโปรแกรมย่อย (Sub program หรือ Function) ว่ามาจากตัวไหนกันแน่
    ' เวลาที่มีโปรแกรมย่อยเหล่านี้อยู่
    MsgBox Err.Number & vbCrLf & Err.Description, vbOKOnly + vbCritical, "Error: ฟังค์ชั่น Connect"
      ' การติดต่อล้มเหลวผิดพลาด ต้องส่งค่ากลับเป็น False
    Connect = False
     ' การใช้ Resume ในกรณีที่เกิด Error ขึ้นมา ส่วน GoTo มันกระโดดไปแบบไม่มีเงื่อนไขเลย  
 Resume ExitProc
End Function
' ทำการอ่าน WorkSheet หรือเสมือนกับว่ามันคือตารางข้อมูล (Table) นั่นแหละ
Private Sub GetExcelTables()
    ' ประกาศตัวแปร RecordSet หรือ ตารางเสมือน
    Dim RS As ADODB.Recordset
    'Set RS = New ADODB.Recordset
    With Conn
        ' อ่านค่า Sheet ที่คุณเลือกเข้าสู่ RecordSet (มองเหมือนรูปแบบของตาราง - SchemaTables)
        Set RS = .OpenSchema(adSchemaTables)
    End With
    ' ' Loop ไปเรื่อยๆ จนกว่าจะหมดจำนวนของ WorkSheet
    Do While Not RS.EOF
        ' นำชื่อ WorkSheet (หรือ ชื่อตาราง) มาใส่ไว้ใน ComboBox
        cmbWorkSheet.AddItem (RS.Fields("TABLE_NAME").Value)
        RS.MoveNext
    Loop
    End Sub
' อ่านข้อมูลที่อยู่ในเซลล์ต่างๆเข้าสู่ Flexgrid
' เหมือนอ่านข้อมูลออกจากตาราง (Table) ใน MS Access ที่เราคุ้นเคย
Private Sub GetExcelData()
    Dim RS As ADODB.Recordset
    Set RS = New ADODB.Recordset
    With RS
        .ActiveConnection = Conn
        .CursorLocation = adUseClient
        .CursorType = adOpenStatic
        .LockType = adLockReadOnly
        ' ไม่บรรยายแล้วกัน SQL Statement
        .Source = "SELECT * FROM [" & cmbWorkSheet.Text & "]"
        .Open
       
        ' กำหนด DataSource ให้กับ FlexGrid
        Set fgSheet.DataSource = RS
    End With
    RS.Close
    Set RS = Nothing
End Sub
' เริ่มต้นการเปิดไฟล์ Excel
Private Sub cmdOpenXLS_Click()
'On Error Resume Next
On Error GoTo ErrHandler
    With dlgOpenFile
        .DialogTitle = "เลือกไฟล์ Microsoft Excel"
        .InitDir = App.Path
        ' เลือกเฉพาะไฟล์ Excel
        .Filter = "All Microsoft Excel Files (*.xls)|*.xls"
        .ShowOpen
การกดปุ่ม Cancel ตอนเลือกไฟล์ซึ่งใช้ร่วมกับ On Error GoTo ErrHandler
  ' และต้องสั่งให้ dlgOpenFile.CancelError = True
  ' เพื่อให้เกิดการแจ้ง Error  โดย Err.Number = 32755 หมายความว่าเกิดการกดปุ่ม Cancel
        .CancelError = True
        If .FileName <> "" Then txtPathNameXLS.Text = .FileName
    End With
   
    ' ไม่มีชื่อไฟล์กลับมา ดังนั้นจะให้มันไปฟังค์ชั่น Connect ทำไมให้เกิด Error
    If txtPathNameXLS.Text = "" Then Exit Sub
   
    การเรียกใช้โปรแกรมย่อย (Sub หรือ Fucntion) เรียงต่อๆกันไปนี่
    ' บางทีก็หาจุดของการเกิด Error ลำบากเหมือนกัน
    If Connect Then
        cmbWorkSheet.Clear
        Call GetExcelTables
    End If
ExitProc:
    Exit Sub
ErrHandler:
    Select Case Err.Number
    Case 32755
        Err.Clear
        Exit Sub
    ' หรือคอย Trap Error ตัวอื่นๆ
    ' Case xxxx
        ' แจ้งความผิดพลาดเกี่ยวกับอะไร ...
     Case Else
        MsgBox Err.Number & vbCrLf & Err.Description
    End Select
    ' การใช้ Resume ในกรณีที่เกิด Error ขึ้นมา ส่วน GoTo มันกระโดดไปแบบไม่มีเงื่อนไขเลย
    Resume ExitProc
    End Sub
Private Sub cmbWorkSheet_Click()
    If cmbWorkSheet.ListIndex < 0 Then Exit Sub
    ' เรียกการแสดงผลเข้าสู่ FlexGrid
    Call GetExcelData
End Sub
Private Sub Form_Load()
    txtPathNameXLS.Text = ""
    cmbWorkSheet.Clear
    lblDescription.Caption = "โปรแกรมตัวอย่างการใช้งาน ADO และ MS Excel - www.g2gnet.com"
    Me.Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
End Sub
Private Sub cmdExit_Click()
    End
End Sub

ไม่มีความคิดเห็น:

แสดงความคิดเห็น