DAO Access trong VBA Access

DAO Access trong VBA Access sử dụng rất hiệu quả trong việc xử lý tập hợp các bảng ghi.

  1. DAO trong Access là gì?
  2. Chức năng chính của DAO
  3. Các đối tượng quan trọng trong DAO
  4. Một số ví dụ về hay sử dụng DAO trong VBA Access
  5. Sử dụng DAO để tương tác với 1 file Access khác

1. DAO trong Access là gì?

DAO (Data Access Objects) là một thư viện trong Microsoft Access, được sử dụng để làm việc với dữ liệu trong cơ sở dữ liệu Access (Jet Database Engine).

DAO có 2 chiều xử lý:
DAO write table
DAT read table / query

DAO cho phép bạn lấy dữ liệu từ table / query sau đó chuyển đến và các đối tượng như form, và báo cáo.
 

2. Chức năng chính của DAO

    Kết nối với cơ sở dữ liệu:

        Kết nối với cơ sở dữ liệu Access hiện tại (file Access đang xử lý)

        Các nguồn dữ liệu khác (Access/Excel) hỗ trợ Jet Database Engine.

    Truy vấn dữ liệu:

        Sử dụng SQL để thực hiện các thao tác như SELECT, INSERT, UPDATE, DELETE.

    Duyệt các dòng dữ liệu từ table / query:

        Sử dụng đối tượng Recordset để đọc, thêm, sửa hoặc xóa dữ liệu.

    Quản lý cấu trúc cơ sở dữ liệu:

        Tạo, chỉnh sửa hoặc xóa bảng, chỉ mục, mối quan hệ giữa các bảng.

        Đối với MS Access việc ứng dụng để thay đổi cấu trúc tương đối ít sử dụng, bởi đã có SQL Server thay thế và làm việc này rất tốt.

3. Các đối tượng quan trọng trong DAO

    CurrentDb (file Access đang xử lý)

    Ví dụ: CurrentDb là đối tượng mặc định để tham chiếu đến cơ sở dữ liệu hiện tại.


    Dim db As DAO.Database  
    Set db = CurrentDb ' Kết nối cơ sở dữ liệu hiện tại

    // toàn bộ đối tượng file dữ liệu hiện tại (đang nhúng code VBA) sẽ đưa về 1 biến để xử lý. 

    TableDef Đại diện cho một bảng trong cơ sở dữ liệu.

        Dùng để xem hoặc thay đổi cấu trúc bảng.


    Dim db As DAO.Database
    Dim tdf As DAO.TableDef
    Dim fld As DAO.Field
   
    Set db = CurrentDb
    Set tdf = db.TableDefs("tbHocVien")
 
    For Each fld In tdf.Fields
        Debug.Print "Field Name: " & fld.Name & " | Type: " & fld.Type
    Next fld
    // dọn dẹp bộ nhớ
    Set fld = Nothing
    Set tdf = Nothing
    Set db = Nothing
  

    QueryDef: Đại diện cho một truy vấn đã lưu.

        Có thể được sử dụng để thực thi truy vấn hoặc tạo truy vấn mới.

   Tạo mới query


 Dim db As DAO.Database
    Dim qdf As DAO.QueryDef
    Dim sql As String

    ' Kết nối đến cơ sở dữ liệu hiện tại
    Set db = CurrentDb

    ' Viết câu lệnh SQL cho truy vấn
    sql = "SELECT * FROM YourTable WHERE Age > 30"

    ' Tạo QueryDef mới
    Set qdf = db.CreateQueryDef("QueryAgeAbove30", sql)

    MsgBox "Truy vấn 'QueryAgeAbove30' đã được tạo thành công!"

    ' Dọn dẹp tài nguyên
    Set qdf = Nothing
    Set db = Nothing
 

  - Xóa 1 query


Dim db As DAO.Database

    ' Kết nối đến cơ sở dữ liệu hiện tại
    Set db = CurrentDb

    ' Xóa truy vấn có tên 'QueryWithParams'
    db.QueryDefs.Delete "QueryWithParams"

    MsgBox "Truy vấn 'QueryWithParams' đã được xóa!"

    ' Dọn dẹp tài nguyên
    Set db = Nothing

 

    Recordset: là biến lưu trữ tập hợp nhiều bảng ghi, 1 bảng ghi là tập hợp nhiều cột.

Ví dụ: biến Recordset có dạng như sau:

TT Môn Số giờ
1 Javascript 12
2 HTML 6


        Cho phép đọc, sửa đổi, thêm hoặc xóa dữ liệu tại table.

  Ví dụ cơ bản với DAO

1. Mở và duyệt bảng ghi trong bảng


Sub BrowseData()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    
    Set db = CurrentDb ' Kết nối cơ sở dữ liệu hiện tại
    Set rs = db.OpenRecordset("SELECT * FROM Customers")
    
    Do While Not rs.EOF
        Debug.Print rs!TenMonHoc, rs!SoGio
        rs.MoveNext ' Chuyển đến bản ghi tiếp theo
    Loop
   ' Mở cửa sổ Immediate Window xem dữ liệu ra
    
    rs.Close
    Set rs = Nothing
    Set db = Nothing
End Sub

2. Thêm dữ liệu vào bảng


    Dim db As DAO.Database
    Dim sql As String
    
    Set db = CurrentDb
    sql = "INSERT INTO Customers (TenMonHoc, SoGio) VALUES ('Java',5)"
    db.Execute sql
    
    MsgBox "Đã thêm bản ghi mới!"

3. Cập nhật dữ liệu



    Dim db As DAO.Database
    Dim sql As String
    
    Set db = CurrentDb
    sql = "UPDATE Customers SET SoGio=7 WHERE TenMonHoc= 'HTML'"
    db.Execute sql
    
    MsgBox "Cập nhật dữ liệu thành công!"

4. Một số ví dụ về hay sử dụng DAO trong VBA Access

** Cách viết ngắn gọn dùng biến ADO Access


With CurrentDb.OpenRecordset("Table1")
    .FindFirst "Cot=1"
    .AddNew '.Edit
    
    'Set col value
    '!Cot1 = "value 1"      
       
    .Update
    .Close
End With


** Cách viết đẩy đủ ADO Access


'Khai bao bien
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim strSQL As String

' Bay loi
On Error GoTo ErrorHandler
 
 Set dbs = CurrentDb
 strSQL = "SELECT * FROM tbTest"
 Set rst = dbs.OpenRecordset(strSQL, dbOpenDynaset)
 
 ' Move First
 rst.MoveFirst
 MsgBox rst!ID

 ' Move Last
 rst.MoveLast
 MsgBox "TONG " & rst.RecordCount
 
 
  'Them moi
 With rst
    .AddNew
    ''Set Col
    !HoTen = "A"
    '''''''
    .Update
 End With
 
 ' update
 With rst
    .FindFirst "ID=1"
    .Edit
    ''Set Col
    !HoTen = "AAAAAAAAAAAAAAAA"
    ''''''''
    .Update
 End With
 


 ' Loop All row
 rst.MoveFirst
 Dim strLoopAdd As String
 Do While Not rst.EOF
      If Not IsNull(rst!ID) Then
        strLoopAdd = strLoopAdd + CStr(rst!ID)
      End If
      rst.MoveNext
 Loop
 MsgBox strLoopAdd

 ' END:Loop All row

  ' Sử dụng FOR i=0


rst.MoveLast
rst.MoveFirst

  For i = 1 To  rst.RecordCount  'Chú ý từ 1
        MsgBox rst!TenCot
        rst.MoveNext    
   Next



 ' Clear var
 rst.Close
 dbs.Close
 Set rst = Nothing
 Set dbs = Nothing

 Exit Sub
 ''''''''''''''''''''''''''''''''
ErrorHandler:
   MsgBox "Error #: " & Err.Number & vbCrLf & vbCrLf & Err.Description


 

5. Truy cập file Access khác để tương tác dữ liệu

Sử dụng DAO để lấy dữ liệu file Access khác

Sau khi đã thêm thư viện DAO, bạn có thể sử dụng đối tượng DAO để kết nối tới một cơ sở dữ liệu Access khác. Cách sử dụng cơ bản như sau:

 Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strDbPath As String

' Đường dẫn tới file Access khác
strDbPath = "C:\Path\To\Your\Database.accdb"

' Kết nối đến cơ sở dữ liệu Access khác
Set db = DBEngine.OpenDatabase(strDbPath)

' Lấy một Recordset từ bảng hoặc truy vấn trong cơ sở dữ liệu đó
Set rs = db.OpenRecordset("SELECT * FROM TableName")

' Xử lý dữ liệu trong Recordset
Do While Not rs.EOF
    Debug.Print rs!FieldName
    rs.MoveNext
Loop

' Đóng Recordset và Database
rs.Close
db.Close

Sử dụng DAO để chèn dữ liệu file Access khác 

Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strDbPath As String

' Đường dẫn tới cơ sở dữ liệu Access khác
strDbPath = "C:\Path\To\Your\Database.accdb"

' Mở kết nối tới cơ sở dữ liệu Access khác
Set db = DBEngine.OpenDatabase(strDbPath)

' Mở bảng Employees trong cơ sở dữ liệu đó (chế độ thêm bản ghi)
Set rs = db.OpenRecordset("Employees", dbOpenDynaset)

' Thêm một bản ghi mới
rs.AddNew
rs!EmployeeID = 1001 ' Giá trị cho trường EmployeeID
rs!EmployeeName = "John Doe" ' Giá trị cho trường EmployeeName
rs!Salary = 55000 ' Giá trị cho trường Salary

' Cập nhật bản ghi mới vào bảng
rs.Update

' Đóng Recordset và Database
rs.Close
db.Close

Bài viết liên quan:

DAO Access trong VBA Access sử dụng rất hiệu quả trong việc xử lý tập hợp các bảng ghi.