วันเสาร์ที่ 18 กุมภาพันธ์ พ.ศ. 2555

เทคนิคการใช้ Recordset ในการเปิดตารางฐานข้อมูล ของ Access VBA

เทคนิคการใช้ Recordset ของ MS Access
  1. ใช้ DAO หรือ ADO

    ทั้ง DAO และ ADO ต่างก็มีวัตถุ Recordset เหมือนกัน แต่มี method properties และ options ต่างกัน แต่ DAO เป็น native library ที่ของ ACCESS
    MS Access แต่ละรุ่นมีการตั้งค่า Default ของ Library ต่างกัน ดังนั้น ในการกำหนด Dim ต้องกำหนดให้ชัดเจน เช่น

    Dim rst as DAO.Recordset
    ไม่ใช่ Dim rst as Recordset

  2. ควรกำหนด Type ให้กับ Recordset เสมอ

    โดยปกติ Access จะกำหนด Type เป็นแบบ Dynaset (dbOpenDynaset) เมื่อเปิด Query หรือ ตารางเชื่อมโยง และกำหนด Type  เป็นแบบ Table (dbOpenTable)เมื่อเปิดตารางในฐานข้อมูลเดียวกัน ซึ่งทั้งสองประเภทนี้มี Method ที่ต่างกัน เช่น dbOpenTable มี Seek แต่ไม่มี FindFirst เป็นต้น ดังนั้น ถ้าไม่กำหนด Type และเมื่อมีการแยกตารางออกเพื่อให้มี Front End และ Back End จะทำให้เกิด Error ได้
    - ควรกำหนด Type เป็นแบบ Dynaset จะครอบคลุมได้ทุกกรณี
    - dbOpenTable มี Seek method ที่ทำงานได้เร็วมาก แต่จะใช้กับ SQL Statement ไม่ได้
    - ถ้าต้องการความเร็ว และไม่ต้องการแก้ไขข้อมูล ให้กำหนด Type เป็น dbOpenSnapshot

    ตัวอย่าง

    Set rst = db.OpenRecordset("Table1", dbOpenDynaset)

  3. การใช้ Move Method

    การใช้ Move Method (MoveFirst, MoveLast, MoveNext หรือ  MovePrevious) จะเกิด Error ถ้าเปิดตารางแล้วไม่มีข้อมูลใน Recordset ดังนั้นก่อนเรียกใช้ move method จึงต้องตรวจสอบเสียก่อนว่ามีข้อมูลอยู่หรือไม่ เช่น

    If Not (rst.BOF And rst.EOF) Then ' ถ้า จุดเริ่มต้นและจุดสุดท้ายของไฟล์เป็นจริงเหมือนกัน แสดงว่า ไม่มีข้อมูล

    หรือ


    If rst.RecordCount <> 0 Then ' เชื่อถือได้ 100% เมื่อใช้กับ DAO แต่บางครั้ง เมื่อใช้กับ ADO จะให้ค่าออกมาเป็น  -1

  4. การใช้ RecordCount โดยไม่เรียกใช้ Movelast เสียก่อน

    โดยปกติ recordset ที่เปิด Query และตารางเชื่อมโยง RecordCount จะแสดงจำนวน Record ที่ผ่านมา ดังนั้น เมื่อเรียก OpenRecordset() โปรแกรม Access จะเก็บ Record แรกเอาไว้ก่อน ในขณะที่กำลัง load record อื่น ๆ ที่เหลือ ดังนั้น เมื่อเรียกใช้ RecordCount ทันทีหลังจากเรียก OpenRecordset() โปรแกรม Access จะไม่แสดงค่าที่ถูกต้อง คือถ้าไม่มีข้อมูลเลย จะได้ค่า 0 แต่ถ้ามีข้อมูล จะได้ค่าเป็น 1 (ยกเว้น กำหนด Type เป็น dbOpenTable)

    ถ้าเรียกใช้ MoveLast ก่อน จะทำให้ Access รอจนกว่าจะ load ทุก Record เสียก่อน จึงจะนับจำนวน อย่างไรก็ตาม การทำงานก็จะช้าลงด้วย เพราะต้องคอย โดยเฉพาะถ้ามีข้อมูลจำนวนมาก ๆ หรือ มีการเรียกใช้ข้อมูลจากเครือข่าย เป็นต้น


  5. การใช้ MoveNext โดยไม่ตรวจสอบ EOF เสียก่อน

    การใช้ MoveNext โดยไม่ตรวจสอบ EOF เสียก่อน เมื่อไปถึงจุดสุดท้าย จะทำให้เกิด Error ได้
    ควรมีการตรวจสอบ ตามตัวอย่างต่อไปนี้

    Do while Not rst.EOF
          If rst![MyField] <> Something Then 'The real loop exit condition.
                    Exit Do
          End If
                  ' Rest of your code here.

          rst.MoveNext
    Loop


  6. การใช้ Loop โดยไม่มี MoveNext

    การใช้ Loop โดยไม่มี MoveNext จะทำให้โปรแกรมวนแบบไม่รู้จบ โปรแกรมจะไม่ทำงานอย่างอื่น ต้องกด Ctrl + Break เพื่อหยุด เพื่อป้องกันไม่ให้สิ่งนี้เกิดขึ้น จึงต้องกำหนดให้เลื่อนตำแหน่งไปยัง Record อื่นด้วยเสมอ


  7. การใช้ Seek หรือ FindFirst โดยไม่ตรวจสอบ NoMatch

    การใช้ Seek หรือ FindFirst โดยไม่ตรวจสอบ NoMatch จะเกิด Error ถ้าหาไม่พบ ดังนั้น ต้องมีการตรวจสอบ NoMatch ด้วย เช่น
    rst.FindFirst "City = ""New York"""
          If Not rst.NoMatch Then
                  'It's okay to keep processing.
          End If


  8. การใช้ AddNew โดยไม่เรียก LastModified

    การเพิ่มข้อมูลใน Record โดยปกติ Access จะไม่กำหนด Record ที่เพิ่มใหม่เป็น Record ปัจจุบันให้โดยอัตโนมัติ ถ้าจะทำงานกับ Record ใหม่ที่เพิ่มเข้าไป ต้องกำหนด Bookmark เป็น Record ที่เพิ่งสร้างใหม่ ดังนี้

    rst.AddNew 'Assign fields here.
    rst.Update
    rst.Bookmark = rst.LastModified
         ' Work with the new record here.


  9. ควรปิด Recordset เมื่อใช้งานเสร็จแล้ว เสมอ เพื่อล้างหน่วยความจำ ดังนี้

       Sub MyProc
        On Error Goto Err_MyProc
            Dim db as Database
            Dim rst As Recordset

            Set db = CurrentDb()
            Set rst = db.OpenRecordset("MyTable")
                   'Useful code here.
            rst.Close            'ปิด recordset ที่เปิดใช้งาน

        Exit_MyProc:
            Set rst = Nothing    'ยกเลิก Object จาก หน่วยความจำ
            Set db = Nothing
            Exit Sub

        Err_MyProc:
            'Error handler here.
            Resume Exit_MyProc
        End Sub



ที่มา
http://allenbrowne.com/ser-29.html


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

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