Search
Thursday, August 28, 2008 ..:: Articles » VB6 DB Programming Thai Ed. ::.. Register  Login
 เขียนโปรแกรมเชื่อมต่อฐานข้อมูล Access ด้วย VB6 Minimize

เขียนโดยจุติพันธุ์ มงคลสุธี ปรับปรุงล่าสุด ณ. วันที่ 4 กันยายน 2548

Visual Basic 6 นั้นเป็นภาษาที่ปัจจุบันที่ได้รับการปรับปรุงไปยัง VB.NET เรียบร้อยแล้ว แต่ก็ยังได้รับความนิยมในบ้านเรา เพราะความง่ายในการพัฒนา ซึ่งโปรแกรมเกือบทุกโปรแกรมที่ผมเองพัฒนานั้นก็เขียนด้วย VB6 รวมถึง Cash Tracker 3 ที่ออกเมื่อปีที่แล้ว ณ. ตอนนี้ผมได้เปลี่ยนไปใช้ VB.NET เรียบร้อยแล้ว ซึ่ง Cash Tracker 4 นั้นจะเขียนด้วย VB.NET ทั้งหมด. เป็นเพราะว่าหลายคนนั้นสนใจในการเขียนต่อกับฐานข้อมูลใน VB6 ผมจึงคิดว่าจะมีประโยชน์ต่อคนอื่นๆ ถ้าผมนำเอาโค้ดต่างๆที่ผมใช้ใน Cash Tracker มาแสดงวิธีการต่อฐานข้อมูลต่างๆ เพราะผมเองก็เคยประสบเหตุการณ์ด้วยตนเอง ตอนนั้นซื้อหนังสือมาหลายเล่ม หลากหลายวิธี แต่ว่าส่วนใหญ่นั้นวิธีที่เสนอจะอ่านยาก ไม่เข้าใจ หรือไม่ก็ไม่ง่ายต่อการประยุกต์ใช้งานให้เป็นประโยชน์ได้ ดังนั้นผมเลยตัดสินใจมาเขียนเอง อย่างง่ายๆ สั่นๆ ใช้งานได้ และเป็นภาษาไทย เพื่อให้คนไทยด้วยกันสามารถเข้าใจได้ง่าย วิธีที่ผมเอ่ยในนี้นั้น อาจไม่ดีที่สุด โดยจะเน้นให้ง่ายต่อการอ่านและเข้าใจเป็นหลัก ถ้าหากคุณเจอข้อผิดพลาดหรือข้อแนะนำอะไร ก็อีเมล์มาที่ suggest@jutiphan.com ได้ครับ นอกจากจะเป็นการเรียกเปลี่ยนความรู้ทีดีแล้ว ยังช่วยผู้พัฒนาคนอื่นๆที่เข้ามาหาความรู้เพิ่มเติมอีกด้วย

ขณะนี้ SP6 นั้นได้ออกมาเรียบร้อยแล้ว ผมขอแนะนำทุกท่านที่ยังใช้ VB6 นั้นให้ติดตั้ง SP6 ใหม่ล่าสุดเพื่อแก้ไขปัญหาต่างๆเกี่ยวกับฐานข้อมูลครับ

เพิ่มหน้านี้ไปใน Favoritesคลิกที่นี่เพื่อเพิ่มหน้านี้เข้าไปใน Favorites. คุณทราบไหมว่าคุณสามารถเข้าถึงหน้านี้ได้โดยการพิมพ์ว่า www.jutiphan.com/VB

ดูกระดานบอร์ดคลิกที่นี่เพื่อไปยังกระดานบอร์ดของ Visual Basic 6

 

Assumed Level of Expertise บทความนี้ได้ถือว่าผู้อ่านนั้นมีทักษะความรู้ดังต่อไปนี้

  • มีทักษะความรู้ในการเขียนภาษา VB6 เบื้องต้น
  • มีทักษะความรู้ในการเขียน SQL Query

 

Create a Data Project สร้างProjectใหม่โดยเลือกประเภท Data Project

ในกรณีที่จะติดต่อกับฐานข้อมูลนั้นให้เลือกประเภท Data Project เนื่องจากว่าจะมี controls เพิ่มมาให้แล้วยังเพิ่มในส่วนของ Data Environment และ Data Report สำหรับการทำ Report อีกด้วย ถ้าคุณเลือกประเภทนี้ ข้ามไปยังขั้นตอนต่อไปได้เลยครับ

ในกรณีที่ผู้ไม่ได้เลือกประเภทนี้ ก็ไม่เป็นไร เพียงแต่ว่า อาจจะต้องเพิ่ม Control ที่จะใช้ในตัวอย่างนี้เองครับ โดยไปที่ Projects | Components... แล้วก็ในวิธีที่ผมจะกล่าวจะมีการใช้ Data Environment โดยสามารถเพิ่มได้ดังนี้: (ใช้ได้กับ Data Report เช่นเดียวกันครับ)

  • เลือกเมนู Project | Add Data Environment แล้วคุณจะเห็นหน้าต่างใหม่โผล่ขึ้นมากับ DataEnvironment1 ใน Folders View ใต้กลุ่ม Designers

 

Create New Connection สร้างการเชื่อมต่อฐานข้อมูล Microsoft Access โดยการใช้ Data Environment

  • Double click ที่ DataEnvironement1 ด้านขวามือในแฟ้ม Designer แล้วให้คลิกขวาที่ Connection1 แล้วเลือก Properties
  • จากนั้นให้เลือก Microsoft Jet 4.0 DB Provider แล้วคลิก Next >>
  • เลือกฐานข้อมูลที่คุณต้องการจะต่อ จากนั้นกรอกรายละเอียด UserName & Password ถ้าไม่มีก็ปล่อยไว้เหมือนเดิมครับ
  • ทดสอบการเชื่อมต่อโดยการกดปุ่ม Test Connection. ถ้าได้รับการแจ้งว่า Test Connection Succeeded แสดงว่าเรียบร้อยแล้ว

เรียบร้อยแล้วครับ สำหรับการต่อฐานข้อมูล ผมแนะนำให้เปลี่ยนชื่อให้สั้นลง โดยผมจะอ้างอิงด้วยชื่อเหล่านี้: DataEnv1, Conn1 โดยคุณอาจจะเอาไปประยุกต์ใช้เป็น ConnExpenses อย่างที่ใช้ใน Cash Tracker เป็นต้น

 

Create New Command สร้างการสร้างคำสั่งในการแสดงข้อมูล

  • ให้คลิกขวาที่ Conn1 แล้วเลือก Add Command. จากนั้นคลิกขวาที่ Command ใหม่ที่ถูกสร้างขึ้นและเลือก Properties โดยคุณสามารถเลือกว่าต้องการให้คำสั่งชุดนี้นั้นโชว์ตารางอะไรในฐานข้อมูล หรือสามารถเขียนเป็น SQL query ได้ แล้วก็อย่าลืมตั้งชื่อชุดคำสั่งด้วยนะครับ โดยผมนั้นจะขึ้นต้นด้วย cmd อย่างที่เห็นในภาพข้างล่าง. การสร้างคำสั่งโดยวิธีนั้นทำให้ง่ายต่อการเรียกใช้คำสั่งเดิมๆ บ่อยๆ แล้วยังง่ายต่อการแก้ไขจุดเดียวอีกด้วย

  • จากนั้นก็กด OK ครับ แล้วก็เพิ่มคำสั่งได้ตามความต้องการ สำหรับผู้ที่ต้องการความยืดหยุ่นในการกำหนด SQL Query นั้นก็สามารถทำได้ โดยผมจะบอกในขั้นตอนการแสดงข้อมูลแบบเขียนโค้ด

 

Show Data using DataGrid control แสดงข้อมูลด้วย DataGrid control

โดยไม่ต้องเขียนโค้ด เรียกใช้ผ่านชุดคำสั่ง

  • กลับไปที่ฟอร์มเปล่าแล้วให้วาง DataGrid Control มายังที่ฟอร์ม
  • คลิกที่ DataGrid Control แล้วในกล่อง Properties, จะมี DataSource ก็ให้เลือก DataEnv1, แล้วก็ DataMember ก็ให้เลือกชุดคำสั่งเช่น cmdExpenses จากตัวอย่างข้างบน
  • จากนั้นลองเริ่มโปรแกรม คุณจะเห็นว่า ข้อมูลจากฐานข้อมูลนั้นได้ถูกใส่ในยังตาราง โดยไม่ต้องเขียนโค้ดแม้กระทั่งบรรทัดเดียว
  • คุณสามารถตั่งค่าต่างๆ ของ Datagrid control ได้ครับ ซึ่งจะอธิบายในส่วนเทคนิคการปรับแต่ง Datagrid control

โดยการเขียนโค้ด เรียกผ่านชุดคำสั่ง หรือใช้ SQL Query

  • กลับไปที่ฟอร์มเปล่าแล้วให้วาง DataGrid Control มายังที่ฟอร์ม
  • สำหรับตัวอย่าง ให้เพิ่มโค้ดดังต่อไปนี้ไปยัง Event Form_Load โดยคุณคงต้องประยุกต์ไปใช้สำหรับฐานข้อมูลของคุณเองที่ได้เชื่อมต่อมาก่อนหน้านี้

Dim RSExpenses As New ADODB.Recordset 'Recordset ไว้เก็บข้อมูลที่เรียกมา
Dim RSQuery As String 'เป็น variable สำหรับ SQL Query

'เปิดการเชื่อมต่อฐานข้อมูล ทำแค่ครั้งเดียว ควรอยู่ตอนเริ่มการใช้โปรแกรม
DataEnv1.Conn1.Open

'ใส่ชุดคำสั่ง SQL Query
RSQuery = "SELECT * FROM Expenses"

'ดึงข้อมูลโดยการป้อนชุดคำสั่ง และฐานข้อมูลที่เรียกใช้
RSExpenses.Open RSQuery, DataEnv1.Conn1

'ตั้งให้ Datagrid control ดึงข้อมูลจาก Recordset RSExpenses
Set DataGrid1.DataSource = RSExpenses

'ปิดหลังจากเสร็จสิ้นการใช้งาน ไม่ควรไว้รวมกับ Event ที่เรียกใช้ เพราะจะทำให้ข้อมูลที่เรียกใช้นั้นไม่ขึ้น
RSExpenses.Close 'ปิด Recordset
DataEnv1.Conn1.Close
'ปิดการเชื่อมต่อกับฐานข้อมูล

 

Show Data using other controls แสดงข้อมูลด้วยcontrolอื่นๆ

โดยไม่ต้องเขียนโค้ด เรียกใช้ผ่านชุดคำสั่ง

  • ซึ่งก็เหมือนกับ Datagrid control ครับ แต่ว่าจะมี Property DataField เพิ่มซึ่งสามารถกำหนดว่าต้องการให้ control นั้นแสดงผลเป็น field อะไร
    โดยสามารถกำหนดได้เช่น List1.DataField = "ItemName" ก็จะบังคับให้ DataField ที่แสดงผลนั้นเป็น Column ที่เลือก
  • โปรดทราบ: ผมไม่สามารถทำให้ใช้การได้ ไม่ทราบเหมือนกันครับว่าทำไม ถ้าไม่ได้ให้ใช้วิธีอื่นดูครับ

โดยการเขียนโค้ด ไล่ทีละ record ด้วย loop statement

  • ในบางครั้งที่ไม่ต้องการใช้ SQL ในการเขียน เราสามารถไล่ไปทีละrecordได้ หรืออาจจะต้องการเลื่อนไปยังrecordต่อไป หรือก่อนหน้านี้เป็นต้น
  • ตัวอย่างข้างล่างนี้จะเป็นการใช้loopโดยวนตั้งแต่ต้นจนจบเพื่อใส่ชื่อรายการไปยัง listbox control ชื่อ list1

DataEnv1.Conn1.Open
DataEnv1.rscmdExpenses.Open

With DataEnv1.rscmdExpenses
    .MoveFirst                                    'เลื่อนไปยังrecordแรกสุด
    Do While Not .EOF                          'วนจนกว่าจะ EOF (End of File)
        List1.AddItem .Fields("ItemName") 'เพิ่มชื่อรายการไปยัง List1, Listbox control
        .MoveNext                                'เลื่อนไปยังrecordต่อไป
    Loop
End With


DataEnv1.rscmdExpenses.Close             'ปิดrecordset และ ฐานข้อมูลหลังใช้งานแล้ว
DataEnv1.Conn1.Close

    ใน recordset นั้นมี functions หลายอย่างที่สามารถนำไปประยุกต์ได้เช่น .Move, .MoveLast, .MovePrevious, .Find, .Seek, etc

โดยการเขียนโค้ด แสดง record เดียวที่ต้องการ

  • คุณสามารถใช้วิธีข้างบนได้โดยการไล่ทีล่ะ record แล้วใช้ If statement ในการตรวจสอบว่า record ไหนที่ต้องการจริงๆ ซึ่งวิธีนี้เป็นวิธีที่มีประสิทธิภาพต่ำ

  • โดยในกรณีนี้ ให้แนะนำให้ใช้ SQL Query โดยใช้ WHERE clause หรือตัวอื่นๆเพื่อให้ได้ record ที่เราต้องการจะแสดง
    อย่างที่เห็นในตัวอย่างข้างล่างนี้นั้นจะดีงข้อมูล ItemNo ที่ 12 มาแสดงใน labels โดยคุณสามารถปรับให้รับค่ามาใส่ได้ สำหรับการค้นหาใน field ที่คุณต้องการ

'ตัวแปรสำหรับการใช้ SQL Query
Dim RSExpenses As New ADODB.Recordset
Dim RSQuery As String

DataEnv1.Conn1.Open
DataEnv1.rscmdExpenses.Open

RSQuery = "SELECT * FROM Expenses WHERE ItemNo = 12"    'กำหนด SQL Query โดยส่วนนี้สามารถกำหนดว่าต้องการข้อมูลอะไรมาแสดง
RSExpenses.Open RSQuery, DataEnv1.Conn1

'เนื่องจากว่า ItemNo ในฐานข้อมูลที่ใช้นั้นเป็น Primary Key และใน Query นั้นมีเจตนาที่จะดึงมา record เดียว ดังนั้นจึงสั่งให้โชว์ข้อมูลใน record แรกสุดที่เลือกอยู่แล้ว
dtDate.value = RSExpenses.Fields("Date").Value                'โปรดสังเกตว่า parameter ของ Fields นั้นสามารถใช้เลข Index หรือใช้ชื่อของ field ในฐานข้อมูลนั้นๆได้
lblItemNo.Caption = RSExpenses.Fields("ItemNo").Value
lblItemName.Caption = RSExpenses.Fields("ItemName").Value
lblItemType.Caption = RSExpenses.Fields("ItemType").Value
lblItemCost.Caption = FormatCurrency(RSExpenses.Fields("ItemCost").Value, 2, , , vbTrue)

'อย่าลืมปิด recordset และ ฐานข้อมูลหลังจากการใช้งานเสร็จสิ้น
DataEnv1.rscmdExpenses.Close   
DataEnv1.Conn1.Close

 

 

Edit Data using DataGrid control แก้ไขข้อมูลด้วย DataGrid control

โดยไม่ต้องเขียนโค้ด เรียกใช้ผ่านชุดคำสั่ง

  • ผมเองก็ไม่ทราบเหมือนกันครับ คิดว่าเป็นกรณีที่คุณอาจสามารถทำได้ผ่านคำสั่งถ้าคำสั่งของคุณนั้นเป็นการแก้ไขอย่างเช่น UPDATE, INSERT หรือ DELETE statements

โดยการเขียนโค้ด เรียกผ่านชุดคำสั่ง หรือใช้ SQL Query

  • วิธีทำให้แก้ได้ ต้องสั่งตอนเปิด RecordSet ครับ โดยเปลี่ยนเป็น:
    RSExpenses.Open RSQuery, DataEnv1.Conn1, adOpenDynamic, adLockOptimistic, 0

  • วิธีนี้อาจจะใช้ร่วมกับ loop statement ในตัวอย่างก่อนหน้านี้ Syntax สำหรับแก้ไขข้อมูล:
    [RecordSet].[Fields(Index/Name)].Value = [Value] ตัวอย่าง:
    RSExpenses.Fields("ItemName").Value = "NewItem"

  • โดยปกตินั้น ข้อมูลจะได้รับการปรับปรุงโดยอัตโนมัติ แต่คุณสามารถใส่คำสั่งบังคับให้ปรับปรุงได้ ใช้สำหรับการทำปุ่ม Save และในกรณีที่ซับซ้อน มีความเป็นไปได้สูงที่ Recordset จะถูกรียกใช้ซ้ำสำหรับอย่างอื่น ซึ่งในกรณีนี้นั้นฐานข้อมูลจะไม่ได้รับการปรับปรุง. คำสั่งสำหรับการปรับปรุง:
    RSExpenses.Update

 

Customize Datagrid control ปรับแต่ง Datagrid Control

    Datagrid control นั้นสามารถดึงข้อมูลตารางต่างๆได้ โดยต้องทำตามขั้นตอนแสดงข้อมูลโดยไม่ต้องเขียนโค้ด จากนั้นคลิกขวาที่ Datagrid control และเลือก Retrieve fields. (สำหรับผู้ที่เขียนโค้ด หลังจาก Retrieve fields แล้วก็สามารถลบ property DataSource และ DataMember ได้)

    หลังจากนั้นแล้ว คุณก็สามารถตั้งค่าต่างๆได้โดยการ คลิกขวาและเลือก Properties ซึ่งจะมีตัวเลือกต่างๆในเลือกหลายแถบ

 

Add NewRow into recordset เพิ่มข้อมูลในrecordset โดยการเขียนโค้ด

    อย่างโปรแกรม Cash Tracker นั้นจะสามารถเพิ่มrecord เวลาทำเรื่องเพิ่มค่าใช้จ่าย โดยจะทำเมื่อกดปุ่มเพิ่มค่าใช้จ่าย ให้ดูโค้ดตัวอย่างข้างล่างนี้เลยครับ.

With DataEnv1.rscmdExpenses                'เรียกใช้ recordset จากชุดคำสั่งที่ได้ถูกสร้างขึ้นก่อนหน้านี้
    .AddNew                                         'เพิ่ม record ใหม่    
    'ตั้งค่าตาม field ต่างๆที่ต้องการจะเพิ่ม
    .Fields(0).value = DTDate.value           'วิธีนี้คุณสามารถดึงข้อมูลอย่างวันที่ใน DatePicker Control มาใส่ได้อย่างตัวอย่างนี้ (datatype ของ field ต้องเป็น DateTime)
    .Fields(2).value = txtName.Text           'ในกรณีนี้นั้น ข้อมูลได้ถูกป้อนในยัง field โดยใช้ Index ระบุ ซึ่งก็สามารถระบุได้โดยชื่อของ field นั้นๆเหมือนกัน
    .Fields(3).value = cboStore.Text          '    ซึ่งจะทำให้อ่านง่ายกว่า และป้องการความผิดพลาดในอนาคต
    .Fields(4).value = cboType.Text          'รวมถึงข้อมูลจาก ComboBox control หรืออย่างอื่นๆ ก็เหมือนกันครับ
    .Fields(5).value = txtCost.Text
    .Update                                          'จากนั้นทำการปรับปรุงเพื่อยืนยันการเพิ่มเติม 

End With

'ปิดหลังจากเสร็จสิ้นการใช้งาน ไม่ควรไว้รวมกับ Event ที่เรียกใช้ เพราะจะทำให้ข้อมูลที่เรียกใช้นั้นไม่ขึ้น
DataEnv1.rscmdExpenses.Close 'ปิด Recordset
DataEnv1.Conn1.Close
'ปิดการเชื่อมต่อกับฐานข้อมูล

 

Delete rows in the recordset ลบข้อมูลในrecordsetโดยการเขียนโค้ด

โดยใช้ [RecordSet].Delete ครับ อย่างเช่ืน:
RSExpenses.Delete adAffectCurrent                'ลบอันที่เลือกอยู่ ณ. ขณะนี้ (สามารถใช้ร่วมกับ DataGrid ได้)

 

 

ผมจะพยายามเพิ่มเนื้อหาให้ครอบคลุมมากกว่านี้ และในอนาคตอาจจะแบ่งเป็นสัดส่วนในดีกว่าเดิมถ้ามีเนื้อหามากกว่านี้ครับ ตามเวลาว่างที่มีให้นะครับ ถ้าคุณมีความต้องการอะไรเป็นพิเศษก็อีเมล์มาหาได้ครับ

สำหรับผู้ที่สนใจโปรแกรม Cash Tracker, สามารถดูรายละเอียดเพิ่มเติมได้ที่นี่ครับ

 

 

 

บทความ: หน้าหลัก

 


 Print   

 สอบถามความคิดเห็น Minimize
คุณคิดว่าบทความนี้:



Submit Survey  View Results
คุณสามารถช่วยเราพัฒนาบทความนี้ได้ โดยการแสดงความคิดเห็นบนกระดานบอร์ด, ส่งความคิดเห็นของคุณ หรือ อีเมล์มาหาเราครับ

 Print   

Copyright 2005-2008 by Jutiphan Mongkolsuthree   Terms Of Use  Privacy Statement