2010-12-13 50 views
1

我有一個Access 2003數據庫,其中包含到SQL Server 2005數據庫的鏈接表。最近更新用於在Access和SQL Server之間創建ODBC連接的用戶信息(密碼)。在Access 2003中編輯鏈接表信息

當我打開Access數據庫,並嘗試編輯鏈接表信息時,我可以打開表格並查看我的數據。但是,當我關閉Access並重新打開Access數據庫時,它顯示密碼通知已經被反悔,並且我得到一個ODBC連接錯誤。

有人知道我做錯了嗎?

作爲後續行動,看起來我們有大約十幾個Access數據庫,其中有大量的鏈接表,都需要此更新。這是更新此信息的最佳方式嗎?鏈接表似乎是使用不同的機器創建的,因爲ODBC連接中指定的Workstation-ID不同。

+1

你看過鏈接表管理器嗎?應該有一個「保存密碼」複選框。如果它不可用,請參閱http://support.microsoft.com/?id=207823 – Fionnuala 2010-12-13 21:31:04

+0

@Reemou,好主意,但鏈接到視圖的鏈接表存在問題。 – 2010-12-17 09:06:51

+0

如果您沒有多個表,請刪除它們並在創建正確的DSN後重新附加它們。 – 2010-12-17 09:10:13

回答

0

編寫一個例程,它從TableDef更新Connect屬性並使用RefreshLink保存更改。

+0

通常,使用ODBC鏈接表,刪除和重新創建鏈接表幾乎總是更好,因爲這可以確保所有元數據都是最新的。 – 2010-12-19 01:12:23

0

鏈接表管理器(LTM)的問題是,當您鏈接到SQL視圖的鏈接表時。在這種情況下,LTM將重新鏈接「表格」而不重新分配適當的PK,並且它們將不可更新。 我已經寫過一些我從VBE開始的代碼,這是一個快速和骯髒的事情,但如果你需要它,你肯定會適應。 有兩個子表,一個用於表格,另一個用於passthru查詢。

Option Compare Database 
option explicit 

Const kOld = "remote.g" 'string to identify old server 
'new server odbc string 
Const kConnLux = "ODBC;DRIVER=SQL Server Native Client 10.0;SERVER=xxxx;UID=yyyy;PWD=zzzz;" 

Sub UpdateTables() 
    Dim db As Database, td As TableDef 
    Dim hasIndex As Boolean, strSql As String 

    Set db = CurrentDb 
    For Each td In db.TableDefs 
     If InStr(1, td.Connect, kOld) > 0 Then 'lien vers CE serveur ? 
      If td.Name Like "dbo_vw*" And td.Indexes.count = 1 Then 'table = vue attachee --> pbl de clef primaire 
       strSql = "CREATE INDEX " & td.Indexes(0).Name & " ON [" & td.Name & "](" & td.Indexes(0).Fields & ")" 
       ' convert field list from (+fld1;+fld2) to (fld1,fld2) 
       strSql = Replace(strSql, "+", "") 
       strSql = Replace(strSql, ";", ",") 
       hasIndex = True 
      Else 
       hasIndex = False 
      End If 
      td.Connect = kConnLux 
      td.RefreshLink 
      Debug.Print td.Name 
      If hasIndex And td.Indexes.count = 0 Then 
       ' if index now removed then re-create it 
       CurrentDb.Execute strSql 
      End If 
     End If 
    Next td 
    Debug.Print "Done" 
End Sub 

Sub UpdateQueries() 
    Dim db As Database 
    Dim td As QueryDef 
    Set db = CurrentDb 
    For Each td In db.QueryDefs 
     If InStr(1, td.Connect, kOld) > 0 Then 
      td.Connect = kConnLux 
      Debug.Print td.Name, td.Connect 
     End If 
    Next td 
End Sub 
+0

使用ODBC鏈接表,我從不刷新TableDefs的連接字符串,而是刪除它們並從頭開始重新創建它們,因爲這樣可以保證元數據是最新的(缺少哪個更新是原因不可更新的視圖)。 – 2010-12-19 01:13:54