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

时间:2012-07-17 16:01:51

标签: sql ms-access access-vba recordset

我已经根据下面给出的建议更新了代码,我已经测试并且效果很好,以便为将来的用户提供快速参考。


我正在使用以下代码创建链接表而无需为每个用户设置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行(如果在服务器上正确设置了主键)。 / p>

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

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

1 个答案:

答案 0 :(得分:6)

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

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? (阅读我的回答,我在其他答案下的评论)