Phù hợp với nhận xét của tôi ở trên và câu trả lời của Yawar, tôi không biết rằng Truy vấn Chuyển qua có thể chỉnh sửa / cập nhật được. Chúng có thể chỉnh sửa theo nghĩa là bạn có thể chỉnh sửa một đối tượng Truy vấn chuyển qua lưu, nhưng tôi không tin rằng Truy vấn chuyển qua có thể tạo ra một tập bản ghi có thể chỉnh sửa.
Về cơ bản có hai phương pháp để kết nối Access với nguồn dữ liệu không phải Access.
Phương pháp đầu tiên, và phổ biến nhất, là sử dụng một số dạng bảng được liên kết, thường là bảng được liên kết ODBC. Có nhiều phương pháp sử dụng bảng được liên kết ODBC với MS Access nhưng điều mà hầu hết các nhà phát triển thích là sử dụng các kết nối DSN-Less được làm mới hoặc xây dựng lại (xóa và kết nối lại) tại thời điểm ứng dụng của bạn khởi động. Lưu ý rằng khi bạn sử dụng ODBC, bạn cũng vẫn đang sử dụng DAO. DAO là đối tượng truy cập dữ liệu mặc định được tích hợp trong MS Access và ngay cả khi bạn không viết bất kỳ mã DAO cụ thể nào, MS Access vẫn đang sử dụng DAO để liên kết biểu mẫu, báo cáo và truy vấn với nguồn dữ liệu của bạn. Trong trường hợp ODBC, bạn thực sự có hai lớp truy cập dữ liệu tại nơi làm việc, DAO và ODBC. Nhưng bạn có thể sử dụng ODBC / DAO với hiệu suất khá tốt và không cần viết mã (ngoài việc duy trì các bảng được liên kết ODBC).
Phương pháp thứ hai là sử dụng ADO. Trái với suy nghĩ của nhiều người, điều này không có nghĩa là bạn phải sử dụng các biểu mẫu không ràng buộc. Nhưng nó có nghĩa là bạn phải viết nhiều mã hơn là sử dụng JET / DAO / MSAccess hoặc DAO / ODBC / SSQL Server. Bạn phải viết mã để đưa các bản ghi từ cơ sở dữ liệu của bạn vào và ADO Recordset, sau đó sử dụng mã để liên kết biểu mẫu của bạn với Recordset đó. Bạn phải viết thêm mã để giữ cho biểu mẫu con đồng bộ với biểu mẫu mẹ, để chèn khóa ngoại vào biểu mẫu con khi bản ghi mới được tạo và cho nhiều thứ khác, chẳng hạn như lọc và sắp xếp như tính năng lọc và sắp xếp tích hợp của biểu mẫu các tùy chọn thường không hoạt động với tập bản ghi ADO. ADO là một cách tuyệt vời để nói chuyện với SQL Server vì nó thực sự cung cấp cho bạn rất nhiều quyền kiểm soát, nhưng vì nó có cường độ mã cao và vì Bảng liên kết ODBC hoạt động rất tốt, hầu hết các nhà phát triển không khuyên bạn nên sử dụng ADO trừ khi không còn cách nào khác để làm gì bạn muốn làm. Một ví dụ về điều này là gọi Thủ tục lưu trữ. Tôi tin rằng Truy vấn Vượt qua có thể được sử dụng để gọi các Thủ tục đã Lưu trữ nhưng tôi cũng nghĩ rằng có một số hạn chế ở đó (chẳng hạn như sử dụng Tham số). Tôi tin rằng trong hầu hết các trường hợp, các nhà phát triển sử dụng ADO để gọi các thủ tục được lưu trữ. Tôi sử dụng ADO rất nhiều nhưng tôi không sử dụng Thủ tục lưu trữ nhiều (chưa) nên tôi không có nhiều thông tin về điều đó.
Một điều đáng nói khác là DAO với ODBC sử dụng "lazy loading" nhưng ADO buộc bạn phải kéo tất cả dữ liệu, điều này có thể rất tốn thời gian và tiêu tốn nhiều bộ nhớ nếu bạn có> hàng triệu hàng. Hoặc nếu không, bạn sẽ cần triển khai một số loại phân trang.
Dưới đây là chức năng của riêng tôi để tạo một bảng được liên kết DSN-Ít ODBC hơn. Nếu bạn là người mới sử dụng Access và mới sử dụng VBA, điều này có thể không có nhiều ý nghĩa đối với bạn. Mã xóa bất kỳ định nghĩa bảng nào đã tồn tại cho bảng bạn đang cố liên kết, điều này hơi nguy hiểm vì tôi tin rằng nó có thể xóa một bảng cục bộ, không được liên kết mà bạn không muốn. Việc xử lý lỗi ở đây cũng không thực sự nhanh, nhưng hầu hết các mã ví dụ trực tuyến không có khả năng xử lý lỗi tốt trong đó vì các phức tạp liên quan. Việc tạo Chỉ mục khóa chính trên bảng được liên kết không phải lúc nào cũng cần thiết. Tôi chỉ có nó được tích hợp vào chức năng của mình bởi vì tôi cần nó một lần cho một dự án cụ thể, vì vậy bây giờ tôi để nó ở đó và sử dụng nó, tốt hơn hoặc tệ hơn.
Để sử dụng đúng mã này, bạn thực sự cần có một danh sách tất cả các bảng được liên kết của mình ở đâu đó và lặp qua danh sách đó và gọi hàm này cho mỗi bảng. Chức năng này cho phép bạn liên kết bảng với một tên khác với tên thực của nó trong SQL Server. Bạn cũng cần có cách xây dựng một chuỗi kết nối ODBC hợp lệ, chuỗi này cũng phải được chuyển vào hàm này.
Private Sub LinkODBCTable(sSourceTableName As String, _
sLocalTableName As String, _
sPrimaryKeyField As String, _
sConString As String)
Dim dbCurrent As DAO.Database
Dim tdfCurrent As DAO.TableDef
Set dbCurrent = DBEngine.Workspaces(0).Databases(0)
On Error Resume Next
'Be Careful, this could delete a local, non-linked table.
dbCurrent.TableDefs.Delete sLocalTableName
If Err.Number <> 0 Then
If Err.Number = 3011 Then
'Table does not exist
Else
MsgBox "Error in LinkODBCTable" & vbCrLf & vbCrLf & Err.Number & " " & Err.Description
End If
Err.Clear
End If
On Error GoTo 0
Set tdfCurrent = dbCurrent.CreateTableDef(sLocalTableName)
tdfCurrent.Connect = sConString
tdfCurrent.sourceTableName = sSourceTableName
dbCurrent.TableDefs.Append tdfCurrent
On Error Resume Next
If sPrimaryKeyField <> "" Then
dbCurrent.Execute "CREATE INDEX __UniqueIndex ON [" & sLocalTableName & "] (" & sPrimaryKeyField & ")", dbFailOnError
If Err.Number <> 0 Then
If Err.Number = 3283 Then
'Primary Key Already Exists
Else
MsgBox "Error in LinkODBCTable" & vbCrLf & vbCrLf & Err.Number & " " & Err.Description
End If
Err.Clear
End If
End If
Set tdfCurrent = Nothing
Set dbCurrent = Nothing
End Sub
Có một số tài nguyên thực sự tốt mà bạn nên xem liên quan đến DAO, ADO, Truyền qua truy vấn, SQL Server, v.v.:
http://technet.microsoft.com /en-us/library/bb188204%28v=sql.90%29.aspx
http://www.utteraccess.com/wiki/Choosing_between_DAO_and_ADO
Đây là một ví dụ về liên kết biểu mẫu với Tập bản ghi ADO. Tuy nhiên, nó hơi gây hiểu lầm vì tốt nhất nên có một đối tượng kết nối toàn cục vẫn mở trong thời gian chạy của ứng dụng. Điều này cho phép bạn sử dụng các tập bản ghi ADO có thể cập nhật tự động. Sử dụng phương pháp này cũng có thể làm cho tập bản ghi của bạn trở thành một đối tượng cấp biểu mẫu.
http://msdn.microsoft .com / en-us / library / office / bb243828% 28v =office.12% 29.aspx