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.
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.
Sử dụng SQL để thực hiện các thao tác như SELECT, INSERT, UPDATE, DELETE.
Sử dụng đối tượng Recordset để đọc, thêm, sửa hoặc xóa 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.
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ý.
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
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
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
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
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!"
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!"
** 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
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
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
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.