2012-07-17 189 views
3

我已經使用下面給出的建議更新了代碼,我已經測試過並且效果很好,可供未來用戶快速參考。如何使用vba創建表格時指定主鍵


我使用下面的代碼,而不必設置每個用戶的DSN創建鏈接表,我怎麼可以指定一個主鍵,你會問,如果手動連接:

Dim sConnect As String 
Dim db   As DAO.Database 
Dim tdf   As DAO.TableDef 

Set db = CurrentDb 

Set tdf = db.CreateTableDef 
tdf.Name = "dbo_vwFeedback" ' - -- --- This is the Label that you see in Access... 
tdf.Connect = "ODBC;DRIVER=SQL Server;SERVER=server01\serverinstance;DATABASE=db_name;Trusted_Connection=Yes" 
tdf.SourceTableName = "vwFeedback" ' - -- --- This is the actual name in SQL Server, minus the owner. 
db.TableDefs.Append tdf 
CurrentDb.Execute "CREATE UNIQUE INDEX PK_dbo_vwFeedback_PrimaryKey ON dbo_vwFeedback (DataSetID, FeedbackRef) WITH PRIMARY" 

注意:以上是針對SQL Server VIEW的,對於SQL Server TABLE是相同的,但您不需要CurrentDB.Execute行(如果您的主鍵在服務器上正確設置)。

該代碼用於手動鏈接表和指定主鍵。

如果您沒有指定手動或使用上述方法爲SQL Server VIEWs創建索引,則只會看到READ ONLY視圖,並且可能會遇到返回的錯誤數據,請參閱下面的示例註釋。

回答

5

表與你的問題代碼鏈接後,你需要這樣做:

CurrentDb.Execute "CREATE UNIQUE INDEX SomeIndex ON SomeTable (PrimaryKeyColumn) WITH PRIMARY" 

一個完整的示例,請參見VBA Code to Add Linked Table with Primary Key

注意,你不需要做到這一點,如果你鏈接 - Access將自動檢測主鍵(如Remou在他的評論中明確下文)。

但是,當你在訪問鏈接的SQL Server 視圖,它是非常重要指定在訪問視圖正確的主鍵。
如果您指定了錯誤的鍵(=選擇了不標識唯一記錄的列)或者根本沒有鍵,Access會將該視圖作爲只讀錶鏈接(如您已經注意到的)。

另外,它會搞亂顯示的行 - 更多解釋請參見Why does linked view give different results from MS Access vs SQL Manager?
(讀我的答案,我對方的回答下評論)

+0

這可能是一個想法,檢查索引尚未分配('tdf.Indexes.Count'),以及是否它是主要的('tdf.Indexes(0).Primary')。如果您將表格與適當的索引鏈接起來,它將被使用。 – Fionnuala 2012-07-17 23:16:26

+0

這取決於。我正在使用包含服務器表/視圖鏈接列表的本地表,並且我有一個循環遍歷該列表的函數,並刪除並重新鏈接每個表。所以我知道*表格在那個時刻還沒有索引。 – 2012-07-18 05:09:42

+1

我試圖做的一點是,SQL服務器表具有在SQL服務器上設置的主鍵並通過TableDef鏈接,就像在OP中一樣,將自動設置主鍵,而不需要任何進一步干預,名稱將會與SQL Server名稱相同。 – Fionnuala 2012-07-18 08:54:46

相關問題