2009-02-19 29 views
11

Tôi có thể tạo một mdb truy cập và thêm bảng được nối kết vào cơ sở dữ liệu Sql Server thông qua ODBC. Nếu tôi thay đổi máy chủ Sql mà ODBC đang kết nối với bảng điều khiển ODBC applet thì mdb vẫn kết nối với Sql Server ban đầu cho đến khi Access được khởi động lại.Làm thế nào để làm mới bảng được nối kết trong một mdb truy cập khi ODBC thay đổi

Có cách nào để liên kết lại các bảng máy chủ được liên kết này mà không cần khởi động lại Access không?

CHỈNH SỬA: Tôi muốn thực hiện điều này trong mã

Trả lời

29

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.

+1

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

+1

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. –

+1

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

5

Phiên bản Access nào bạn đang sử dụng? Trong năm 2000, bạn có thể vào Công cụ> Cơ sở dữ liệu Tiện ích> Trình quản lý Bảng được Liên kết để thay đổi cài đặt của bạn.

+0

Cảm ơn - bạn nói đúng nó hoạt động nếu tôi sử dụng Trình quản lý bảng được liên kết và chọn hộp "Luôn nhắc vị trí mới" và sau đó chọn ODBC một lần nữa. Tôi muốn relink bảng trong mã mặc dù - Tôi sẽ chỉnh sửa câu hỏi của tôi để làm cho điều này rõ ràng. – BTB

+0

Tại sao bạn muốn liên kết lại bảng của mình? Điều gì sẽ đạt được bằng cách làm điều đó? – Brettski

+1

ODBC được thay đổi để trỏ đến một máy chủ/cơ sở dữ liệu khác - nhưng ứng dụng Access không biết về thay đổi cho đến khi nó được khởi động lại. – BTB

Các vấn đề liên quan