【问题标题】:How to specify Primary Key when using vba to create tables使用vba建表时如何指定主键
【发布时间】:2012-07-17 16:01:51
【问题描述】:

我已经根据下面给出的建议更新了代码,我已经对其进行了测试并且效果很好,供未来用户快速参考。


我正在使用以下代码创建链接表,而无需为每个用户设置 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 VIEW 创建索引,您将只能获得一个 READ ONLY 视图,并且您可能会遇到返回错误数据,请参阅下面的 cmets 示例。

【问题讨论】:

    标签: sql ms-access vba recordset


    【解决方案1】:

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

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

    完整示例请参见VBA Code to Add Linked Table with Primary Key

    请注意,如果您链​​接 表格,您确实不需要执行此操作 - Access 将自动检测主键(正如 Remou 在下面的评论中明确指出的那样)。

    但是当您在 Access 中链接 SQL Server 视图时,在 Access 中为视图指定正确的主键是非常重要
    如果您指定了错误的键(= 您选择了不标识唯一记录的列)或根本没有键,Access 会将视图链接为只读表(正如您已经注意到的那样)。

    另外,它会弄乱显示的行 - 请参阅 Why does linked view give different results from MS Access vs SQL Manager? 以获得更多解释。
    (阅读我的答案,我的 cmets 在另一个答案下)

    【讨论】:

    • 检查索引是否尚未分配 (tdf.Indexes.Count) 以及它是否是主索引 (tdf.Indexes(0).Primary) 可能是一个想法。如果你用合适的索引链接一个表,它将被使用。
    • 视情况而定。我正在使用一个本地表,其中包含要链接的服务器表/视图列表,并且我有一个函数可以遍历该列表,并删除并重新链接每个表。所以我知道那个时候表还没有索引。
    • 我想说的是,在 SQL Server 上设置了主键并通过 TableDef 链接的 SQL Server 表(如在 OP 中)将自动设置主键,无需任何进一步干预,名称将与 SQL Server 名称相同。
    • 是的,你是对的,我应该在回答中提到这一点。但是 OP 链接的是 view,而不是表。当您链接视图时,如果您不想遇到我的回答中描述的问题,必须明确指定键。
    猜你喜欢
    • 2015-08-24
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 2021-03-12
    相关资源
    最近更新 更多