如何在使用vba创建表时指定主键

aSy*_*oad 3 sql ms-access recordset access-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"
Run Code Online (Sandbox Code Playgroud)

注意:以上是针对SQL Server VIEW,它对于SQL Server TABLE是相同的,但您不需要该CurrentDB.Execute行(如果您的主键在服务器上正确设置).

代码位于链接表和手动指定主键的位置.

如果未手动或使用上述方法指定SQL Server VIEW的索引创建,则只能获得READ ONLY视图,并且可能会返回错误的数据,请参阅下面的注释以获取示例.

Chr*_*cht 6

将表格与您问题中的代码相关联后,您需要执行以下操作:

CurrentDb.Execute "CREATE UNIQUE INDEX SomeIndex ON SomeTable (PrimaryKeyColumn) WITH PRIMARY"
Run Code Online (Sandbox Code Playgroud)

有关完整示例,请参阅VBA代码以使用主键添加链接表.

请注意,你不会需要,如果你链接到这样做 - Access将自动检测主键(如Remou在他的评论中明确下文).

但是,当您在Access中链接SQL Server 视图时,为Access中的视图指定正确的主键非常重要.
如果您指定了错误的密钥(=您选择了不标识唯一记录的列)或根本没有密钥,Access会将该视图链接为只读表(如您所知).

此外,它会搞砸显示的行 - 请参阅为什么链接视图会从MS Access与SQL Manager中提供不同的结果?更多解释.
(读我的答案,以及我的其他答案下评论)

  • 是的,你是对的,我应该在我的回答中提到这一点.但是OP正在连接**视图**,而不是表格.当你链接一个视图时,如果你不想遇到我的答案中描述的问题,你**必须明确指定密钥. (2认同)