Bạn có thể sử dụng mã bên dưới để làm mới tất cả các bảng ODBC trong dự án Access của bạn đến DSN đã cho.
Làm thế nào để sử dụng nó
Chỉ cần copy đoạn code trong một module VBA mới hoặc hiện tại, và nếu bạn muốn làm mới liên kết, gọi nó với DSN thích hợp cho kết nối ODBC mới:
RefreshODBCLinks "ODBC;DRIVER=SQL Server Native Client 10.0;" & _"
"SERVER=SQLSERVER;UID=Administrator;" & _
"Trusted_Connection=Yes;" & _
"APP=2007 Microsoft Office system;DATABASE=OrderSystem;"
Ngoài ra, hãy xem trợ giúp Truy cập cho phương thức TableDef.RefreshLink
.
Mã phiên bản 1
cách cổ điển của relinking nhưng truy cập có thể giữ thông tin kết nối trong bộ nhớ nếu các bảng đã được sử dụng trước khi RefreshODBCLinks
được gọi.
Public Sub RefreshODBCLinks(newConnectionString As String)
Dim db As DAO.Database
Dim tb As DAO.TableDef
Set db = CurrentDb
For Each tb In db.TableDefs
If Left(tb.Connect, 4) = "ODBC" Then
tb.Connect = newConnectionString
tb.RefreshLink
Debug.Print "Refreshed ODBC table " & tb.Name
End If
Next tb
Set db = Nothing
End Sub
phiên bản Mã 2
này sẽ hoàn toàn tái tạo các bảng ODBC liên kết: những cái cũ sẽ được đổi tên, sau đó bảng mới sử dụng DSN nhất định sẽ được tạo ra trước khi xóa các phiên bản liên kết cũ .
Hãy đảm bảo bạn kiểm tra điều này và có thể thêm một số mã để xử lý lỗi tốt hơn khi cần thiết.
Cũng lưu ý rằng tham số dbAttachSavePWD
được truyền trong khi tạo bảng ODBC sẽ lưu mật khẩu ODBC (nếu có) trong Access. Chỉ cần loại bỏ nó nếu đó không phải là những gì bạn cần.
Public Sub RefreshODBCLinks(newConnectionString As String)
Dim db As DAO.Database
Dim tb As DAO.TableDef
Dim originalname As String
Dim tempname As String
Dim sourcename As String
Dim i As Integer
Set db = CurrentDb
' Get a list of all ODBC tables '
Dim tables As New Collection
For Each tb In db.TableDefs
If (Left(tb.Connect, 4) = "ODBC") Then
tables.Add Item:=tb.Name, key:=tb.Name
End If
Next tb
' Create new tables using the given DSN after moving the old ones '
For i = tables.count To 1 Step -1
originalname = tables(i)
tempname = "~" & originalname & "~"
sourcename = db.TableDefs(originalname).SourceTableName
' Create the replacement table '
db.TableDefs(originalname).Name = tempname
Set tb = db.CreateTableDef(originalname, dbAttachSavePWD, _
sourcename, newConnectionString)
db.TableDefs.Append tb
db.TableDefs.Refresh
' delete the old table '
DoCmd.DeleteObject acTable, tempname
db.TableDefs.Refresh
tables.Remove originalname
Debug.Print "Refreshed ODBC table " & originalname
Next i
Set db = Nothing
End Sub
Một điều cuối cùng: nếu bạn vẫn nhận được những vấn đề mà yêu cầu bạn khởi động lại truy cập để những thay đổi được hiển thị, sau đó có một cái nhìn tại mã của tôi trong Restarting and compacting the database programmatically trên trang web của tôi.
Lưu ý: Mã phiên bản 2 được lấy cảm hứng một phần từ this Access Web article.
Sẽ là một ý kiến hay nếu loại trừ các bảng hệ thống, đó là các bảng bắt đầu "MSys" – Fionnuala
OK, nhưng tại sao chúng lại có một chuỗi kết nối bắt đầu bằng "ODBC"? Họ sẽ không phù hợp với điều đó trong mọi trường hợp. –
Nó xuất hiện để làm việc cho tôi nhưng chỉ khi tôi thay đổi chuỗi kết nối. Nếu tôi thay đổi nói rằng máy chủ trong ODBC thì bảng được nối kết vẫn kết nối với máy chủ gốc sau khi tôi gọi hàm RefreshODBCLinks. Nếu tôi thay đổi tên cơ sở dữ liệu trong chuỗi kết nối thì máy chủ được liên kết sẽ được làm mới. – BTB