[VB6] พื้นฐานการนำข้อมูลจาก DataBase มาแสดงผลบนตารางกริด (ADODC)
วันนี้แอดมินจะพาย้อนเวลาถอยหลังกลับไปเมื่อ 20 ปีที่แล้ว กับการเริ่มต้นฝึกฝนเขียนโปรแกรมด้วย Visual Basic 4.0 รุ่น 32 บิท ในยุคที่ข้อมูลข่าวสารทางอินเทอร์เน็ตยังไม่ได้รุ่งเรืองเหมือนในปัจจุบันนี้ ตอนที่ไมโครซอฟท์ออก VB4 มาใหม่ๆ เรียกได้ว่าตื่นตะลึงกันทั้งวงการ เพราะการเชื่อมต่อฐานข้อมูล มันทำในลักษณะแบบ Visual Style ซึ่งทำได้ง่ายดายมากด้วยการลากคอนโทรลมาวางแปะ (นี่คือจุดเริ่มต้นที่ VB ถูกค่อนแคะว่าเขียนโปรแกรมแบบไม่ต้องใช้สมอง) แต่ทว่าด้วยวิธีการนี้มันกลับไม่สามารถตอบโจทย์ของแอดมินหรือคนอื่นๆได้เลย เพราะการพัฒนามันยุ่งยาก ขาดความยืดหยุ่น ผู้ใช้งานก็ใช้ยากอีกนั่นแหละ ...แอดมินภูมิใจนำเสนอ "รากเหง้า" ของการพัฒนาโปรแกรมติดต่อฐานข้อมูลด้วย Visual Basic 6.0 (SP6) ซึ่งอยากให้ทุกๆท่านได้ลองเปรียบเทียบกันดูซิว่า VB6 มันเหมือนหรือแตกต่างไปจาก VB.Net ที่แอดมินได้เผยแพร่ออกไปเมื่อไม่กี่วันที่ผ่านมา ด้วยวิธีการ Bound Data ในแบบ Run Time ซึ่งจะไม่ใช่การจับลากมาวางแปะแล้วจบ ...http://www.g2gnet.com/webboard/images/vb6/BoundDataRun.png
หน้าจอโปรแกรม ... วิธีการนี้เราเรียกว่า การค้นคืนข้อมูล หรือ Retrieve Data อันเป็นจุดเริ่มต้นของทุกๆงาน
http://www.g2gnet.com/webboard/images/vb6/BoundDataReference.png
การอ้างอิงถึง ADO (Microsoft ActiveX Data Object) เพื่อพูดคุยติดต่อกับฐานข้อมูล
http://www.g2gnet.com/webboard/images/vb6/BoundDataComponent.png
เลือก Component มาใช้งาน
http://www.g2gnet.com/webboard/images/vb6/BoundDataDesign.png
หน้าจอการออกแบบ โดยจะไม่มีการผูกข้อมูล (Bound Data) ให้กับ ADODC (ADO Data Control) เปรียบเทียบได้กับ Data Source บน VB.Net นั่นเอง
http://www.g2gnet.com/webboard/images/vb6/BoundDataQuery.png
แอดมินขอแนะนำให้ลองฝึกใช้เครื่องมือง่ายๆอย่าง MS Access ก่อนครับ ... เป็นตัวอย่างการเชื่อมความสัมพันธ์ของตารางข้อมูลแบบ One To One
http://www.g2gnet.com/webboard/images/vb6/BoundDataAccess.png
ทดสอบ Query จาก MS Access
' / --------------------------------------------------------------------------------
'// Load data into DataGridView.
Sub BindDataGrid(ByVal Sql As String)
' Data Control กับกำหนดการเชื่อมต่อไฟล์ฐานข้อมูลแบบ @Run Time
With Adodc1
.CursorLocation = adUseClient
'// ให้อ่าน SQL Statement (Query)
.CommandType = adCmdText
'// แสดงผลข้อมูลอย่างเดียว ใช้ LockType แบบ Read Only
.LockType = adLockReadOnly
'// กำหนด RecordSource ด้วย Query
.RecordSource = Sql
'// สั่งให้ประมวลผลเพื่อกำหนด RecordSource ที่มาจาก SQL Statement
.Refresh
End With
'// Bound Data between Adodc1 and DataGrid Control
Set DataGrid1.DataSource = Adodc1
End Subการ Bound Data แบบ Run Time ... สังเกตครับว่าเหมือนใน VB.Net หรือไม่???
มาดูโค้ดฉบับเต็ม ...
' / --------------------------------------------------------------------------------
' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
' / eMail : thongkorn@hotmail.com
' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
' / Facebook: https://www.facebook.com/g2gnet (For Thailand)
' / Facebook: https://www.facebook.com/commonindy (Worldwide)
' /
' / Purpose: Simple procedure to binding data into DataGrid @Run Time. (ADODC)
' / Microsoft Visual Basic 6 (SP6) + MS Access 2007+
' /
' / This is open source code under @Copyleft by Thongkorn Tubtimkrob.
' / You can modify and/or distribute without to inform the developer.
' / --------------------------------------------------------------------------------
Option Explicit
' / --------------------------------------------------------------------------------
Private Sub cmdExecute_Click()
'// Trap Error
If Trim(txtSQL.Text) = "" Or Len(Trim$(txtSQL.Text)) = 0 Then Exit Sub
'// Binding Data into DataGrid
Call BindDataGrid(txtSQL.Text)
End Sub
' / --------------------------------------------------------------------------------
Private Sub cmdOpenDB_Click()
On Error Resume Next
'// เลือกไฟล์ MS Access เข้ามา
dlgOpenDB.FileName = ""
dlgOpenDB.InitDir = App.Path
dlgOpenDB.DialogTitle = "Select Microsoft Access " '// Set the Common Dialog Title
dlgOpenDB.Filter = "Microsoft Access Files |*.accdb;*.mdb" '// Display only mdb files
dlgOpenDB.CancelError = True '// Cancel all errors
dlgOpenDB.ShowOpen
dlgOpenDB.DefaultExt = "*.accdb" '// Set the default extension
If dlgOpenDB.FileName = "" Then Exit Sub
'// Get filename.
txtLocateDB.Text = dlgOpenDB.FileName
'// Trap Error
If Len(txtLocateDB.Text) = 0 Or Trim(txtLocateDB.Text) = "" Then Exit Sub
'// Connect the database by filename of your choice.
If OpenDataBase(Adodc1, txtLocateDB.Text) Then
lblStatus.Caption = "Connection successful ..."
lblStatus.ForeColor = &H8000&
Else
lblStatus.Caption = "Disconnection ..."
lblStatus.ForeColor = vbRed
End If
End Sub
' / --------------------------------------------------------------------------------
'// รับค่า ADODC และชื่อไฟล์, คืนค่าเป็น True หากทำการติดต่อฐานข้อมูลสำเร็จ
Private Function OpenDataBase(AdoControl As Adodc, DBFile As String) As Boolean
On Error GoTo ErrHandler
'// Provider=Microsoft.Jet.OLEDB.4.0 --> For MS Access 2003
With AdoControl
.ConnectionString = _
" Provider=Microsoft.ACE.OLEDB.12.0; " & _
" Data Source=" & DBFile & ";" & _
" Persist Security Info=False;"
End With
OpenDataBase = True
ExitProc:
Exit Function
ErrHandler:
MsgBox "Open Database Error : " & vbCrLf & Err.Number & " " & Err.Description
'ConnectDataBase = False
'Resume ExitProc
End
End Function
' / --------------------------------------------------------------------------------
Private Sub Form_Load()
'// Turn off visibility
Adodc1.Visible = False
txtLocateDB.Text = ""
lblStatus.Caption = "Status"
'txtSQL.Text = ""
'// ตัวอย่าง SQL Statement
'txtSQL.Text = "SELECT ContactPK, Fullname, NickName, Phone FROM tblContact ORDER BY ContactPK"
txtSQL.Text = _
"SELECT tblContact.ContactPK, tblContact.Fullname, " & _
"tblPosition.PositionName, tblDepartment.DepartmentName " & _
"FROM tblDepartment INNER JOIN (tblContact INNER JOIN tblPosition ON " & _
"tblContact.PositionFK = tblPosition.PositionPK) ON tblDepartment.DepartmentPK = tblContact.DepartmentFK "
End Sub
' / --------------------------------------------------------------------------------
'// Load data into DataGridView.
Sub BindDataGrid(ByVal Sql As String)
' Data Control กับกำหนดการเชื่อมต่อไฟล์ฐานข้อมูลแบบ @Run Time
With Adodc1
.CursorLocation = adUseClient
'// ให้อ่าน SQL Statement (Query)
.CommandType = adCmdText
'// แสดงผลข้อมูลอย่างเดียว ใช้ LockType แบบ Read Only
.LockType = adLockReadOnly
'// กำหนด RecordSource ด้วย Query
.RecordSource = Sql
'// สั่งให้ประมวลผลเพื่อกำหนด RecordSource ที่มาจาก SQL Statement
.Refresh
End With
'// Bound Data between Adodc1 and DataGrid Control
Set DataGrid1.DataSource = Adodc1
End Sub
' / --------------------------------------------------------------------------------
Private Sub Form_Unload(Cancel As Integer)
Set frmBoundData = Nothing
End Sub
' / --------------------------------------------------------------------------------
Private Sub txtLocateDB_KeyPress(KeyAscii As Integer)
'// Lock key
KeyAscii = 0
End SubConclusion: จะเห็นได้อย่างชัดเจนเลยว่า หลักการวิธีคิดที่มาจาก VB6 สามารถนำมาใช้ได้กับ VB.Net ได้เหมือนกันเป๊ะๆเลย ... นี่แหละที่เราเรียกกันว่า "พื้นฐาน"
ดาวน์โหลดโค้ดต้นฉบับ VB6 ได้ที่นี่
หน้า:
[1]