Hướng dẫn cách kết nối VBA Access với SQL Server
Bước này chỉ làm 1 lần duy nhất
Trong cửa sổ VBA (Alt + F11):
Vào menu: Tools → References
Tìm và tick chọn:
✅ Microsoft ActiveX Data Objects 6.1 Library (hoặc 2.8 nếu không có 6.1)
Là câu kết nối từ ứng dụng MS Access đến SQL Server, câu này chứa thông tin gồm máy chủ, user, pass của máy chủ
- Chuỗi kết nối: sử dụng SQL Server Authentication
strConn = "Provider=SQLOLEDB;" & _
"Data Source=TenServerHoacIP;" & _
"Initial Catalog=TenDatabase;" & _
"User ID=ten_dang_nhap;" & _
"Password=mat_khau;"
- Chuỗi kết nối: Windows Authentication (không có User/Password)
strConn = "Provider=SQLOLEDB;" & _
"Data Source=TenServer;" & _
"Initial Catalog=TenDatabase;" & _
"Integrated Security=SSPI;"
Dim conn As ADODB.Connection
Kết nối đến SQL Server, giống như 1 sợ dây điện kết nối đến máy chủ.
Dim rs As ADODB.Recordset
Sau khi lấy dữ liệu từ table / view thì biến Recordset chứa đựng giá trị.
Dim cmd As ADODB.Command
Thực thi gởi các câu lệnh như Inser / update / delete
Dim conn As ADODB.Connection
Dim strConn As String
' Tạo đối tượng connection
Set conn = New ADODB.Connection
' Chuỗi kết nối: sử dụng SQL Server Authentication
strConn = "Provider=SQLOLEDB;" & _
"Data Source=TenServerHoacIP;" & _
"Initial Catalog=TenDatabase;" & _
"User ID=ten_dang_nhap;" & _
"Password=mat_khau;"
' Mở kết nối
conn.Open strConn
conn.Close
Việc đóng kết nối sau khi mở trong lập trình (như ADO/VBA) là bắt buộc và rất quan trọng vì các lý do sau:
✅ Giải phóng tài nguyên hệ thống
Mỗi kết nối SQL Server mở ra sẽ chiếm tài nguyên (RAM, socket TCP, thread...).
Nếu bạn mở nhưng không đóng, tài nguyên đó không được thu hồi, gây rò rỉ (leak).
Với nhiều người dùng, việc không đóng kết nối có thể làm quá tải SQL Server hoặc Access bị treo.
🔍 Ví dụ: mở 1 form nhập liệu → chạy Sub mở kết nối → không đóng → mỗi lần click, tạo thêm 1 kết nối nữa → 100 lần click = 100 kết nối mở.
✅ Giới hạn số kết nối của SQL Server
SQL Server có giới hạn số kết nối đồng thời (concurrent connections).
Nếu bạn mở kết nối mà không đóng, chương trình khác không thể truy cập vì hết slot.
✅ Tăng hiệu năng với Connection Pooling
Khi bạn đóng kết nối đúng cách, .NET/ADO sẽ giữ lại kết nối trong pool, sẵn sàng dùng lại nhanh hơn.
Nếu bạn không đóng, hệ thống không biết khi nào nên tái sử dụng kết nối → gây chậm.
✅ Tránh lỗi "Too many connections" hoặc "Timeout"
Khi số kết nối vượt mức, bạn có thể gặp lỗi như:
Timeout expired.
Cannot open database requested...
Connection limit exceeded.
Sub KetNoiSQL()
Dim conn As ADODB.Connection
Dim strConn As String
' Tạo đối tượng connection
Set conn = New ADODB.Connection
' Chuỗi kết nối: sử dụng SQL Server Authentication
strConn = "Provider=SQLOLEDB;" & _
"Data Source=TenServerHoacIP;" & _
"Initial Catalog=TenDatabase;" & _
"User ID=ten_dang_nhap;" & _
"Password=mat_khau;"
' Mở kết nối
conn.Open strConn
Dim sql As String
Dim rs As ADODB.Recordset
' Câu truy vấn ví dụ
sql = "SELECT * FROM HocSinh"
' Mở recordset
Set rs = New ADODB.Recordset
rs.Open sql, conn, adOpenStatic, adLockReadOnly
' Hiển thị dữ liệu (ví dụ in ra Immediate Window - Ctrl+G)
Do While Not rs.EOF
Debug.Print rs!TenHS
rs.MoveNext
Loop
' Đóng kết nối
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
MsgBox "Xong!"
End Sub
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim strConn As String
' 1. Kết nối SQL Server
strConn = "Provider=SQLOLEDB;" & _
"Data Source=TEN_SERVER;" & _
"Initial Catalog=TEN_DATABASE;" & _
"User ID=ten_dang_nhap;" & _
"Password=mat_khau;"
Set conn = New ADODB.Connection
conn.Open strConn
' 2. Mở Recordset cho phép ghi
Set rs = New ADODB.Recordset
rs.Open "SELECT * FROM HocSinh", conn, adOpenDynamic, adLockOptimistic
' 3. Thêm dòng mới
rs.AddNew
rs!TenHS = "Trần Văn C"
rs!NgaySinh = #3/15/2012#
rs.Update
' 4. Đóng kết nối
rs.Close: conn.Close
Set rs = Nothing: Set conn = Nothing
MsgBox "Đã thêm học sinh!"
Dim conn As ADODB.Connection
Dim strConn As String
' Chuỗi kết nối SQL Server (có thể dùng Windows Auth hoặc SQL Auth)
strConn = "Provider=SQLOLEDB;" & _
"Data Source=TEN_SERVER;" & _
"Initial Catalog=TEN_DATABASE;" & _
"User ID=ten_dang_nhap;" & _
"Password=mat_khau;"
' Tạo đối tượng connection và command
Set conn = New ADODB.Connection
conn.Open strConn
Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
cmd.ActiveConnection = conn
cmd.CommandText = "Insert into HocSinh(TT,HoTen) values(15,'A')"
cmd.Execute
conn.Close
Set cmd = Nothing
Set conn = Nothing
MsgBox "Đã chèn xong học sinh!"
Dim conn As ADODB.Connection
Dim cmd As ADODB.Command
Dim strConn As String
' 1. Chuỗi kết nối
strConn = "Provider=SQLOLEDB;" & _
"Data Source=TEN_SERVER;" & _
"Initial Catalog=TEN_DATABASE;" & _
"User ID=ten_dang_nhap;" & _
"Password=mat_khau;"
' 2. Tạo kết nối
Set conn = New ADODB.Connection
conn.Open strConn
' 3. Tạo lệnh gọi thủ tục
Set cmd = New ADODB.Command
With cmd
.ActiveConnection = conn
.CommandType = adCmdStoredProc
.CommandText = "sp_ThemHocSinh"
' Truyền tham số
.Parameters.Append .CreateParameter("@TenHS", adVarWChar, adParamInput, 100, "Nguyễn Văn B")
.Parameters.Append .CreateParameter("@NgaySinh", adDate, adParamInput, , #1/1/2009#)
' Gọi thủ tục
.Execute
End With
' 4. Đóng kết nối
conn.Close
Set cmd = Nothing
Set conn = Nothing
MsgBox "Đã chèn học sinh bằng Stored Procedure!"
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim cmd As ADODB.Command
Dim strConn As String
' 1. Chuỗi kết nối SQL Server
strConn = "Provider=SQLOLEDB;" & _
"Data Source=TEN_SERVER;" & _
"Initial Catalog=TEN_DATABASE;" & _
"User ID=ten_dang_nhap;" & _
"Password=mat_khau;"
' 2. Mở kết nối
Set conn = New ADODB.Connection
conn.Open strConn
' 3. Tạo và cấu hình command
Set cmd = New ADODB.Command
With cmd
.ActiveConnection = conn
.CommandType = adCmdStoredProc
.CommandText = "sp_DanhSachHocSinh"
End With
' 4. Mở recordset để nhận kết quả trả về (giống DataTable)
Set rs = New ADODB.Recordset
rs.Open cmd, , adOpenStatic, adLockReadOnly
' 5. Duyệt dữ liệu (giống DataTable.Rows)
Do While Not rs.EOF
Debug.Print rs!MaHS & " - " & rs!TenHS & " - " & rs!NgaySinh
rs.MoveNext
Loop
' 6. Đóng kết nối
rs.Close: Set rs = Nothing
conn.Close: Set conn = Nothing
MsgBox "Đã đọc xong danh sách!"
End Sub
Khi table có cột dạng identity thì sử dụng câu kết nối là
Set rst = dbs.OpenRecordset(sql, dbOpenDynaset, dbSeeChanges)
* Thêm thư viện vào trong file Access
*** Viết code VBA Access kết nối với SQL Server
Dim Conn As New ADODB.Connection
Dim rcs As New ADODB.Recordset
Dim strCn As String
strCn = "PROVIDER=SQLOLEDB;SERVER=HONGNHAT2\SQLEXPRESS;DATABASE=nhanvien;UID=sa;PWD=123"
Dim cn As New ADODB.Connection
cn.ConnectionString = strCn
cn.CommandTimeout = 30
cn.Mode = adModeReadWrite
cn.Open
Dim cmd As New ADODB.Command
With cmd
.ActiveConnection = cn
.CommandType = adCmdText
.CommandTimeout = 60
.CommandText = "Select * From dbo.tbNhanVien"
End With
Dim prm As Object
rcs.CursorType = adOpenKeyset
rcs.LockType = adLockBatchOptimistic
rcs.Open cmd
Set rcs = cmd.Execute
Do While (Not rcs Is Nothing)
If rcs.State = adStateClosed Then Exit Do
While Not rcs.EOF
'For i = 0 To rcs.Fields.Count - 1
' rStr = rStr & " : " & rcs(i)
' Next i
MsgBox rcs!HoTen
rcs.MoveNext
Wend
Set rcs = rcs.NextRecordset
Loop
** Thay thế các chữ màu đỏ lại cho phù hợp trong đoạn code VBA trên,
Tìm kiếm:
Hướng dẫn sử dụng VBA Access kết nối SQL Server chi tiết từ A-Z