在 Access 2003 中链接 SQL table (!) 而不是 updatable

Linked SQL table in Access 2003 (!) not updatable

我目前正在使用旧版应用程序,将 Access 2003 升级到 link 到 SQL Server tables(2008 R2 或更高版本)。使用代码 tables link,我可以插入,但不能更新或删除。我已经尝试了网络上的所有内容,没有骰子。详情如下。

简洁所以不 tl;dr.

表首先使用升迁向导创建。在使用中,应用程序必须连接到同一架构中的不同应用程序,因此不能只是设置并忘记。不能做本地 DSN,许多安装,虽然 DSN 文件是可能的。但是也有问题,找不到DSN。稍后详细介绍。

在休息之前:很快我将把这个应用程序进一步更新到 Access 2016 左右。如果这足够不同/那里更容易,我会等几天。也许有人可以为此建议最好的 refsite。

* 问题详情如下 *

使用 DSN 和 UI 到 link 一个 table,我得到一个 editable table。万岁。

但是当我使用下面的代码(在每个 refsite 上都可以找到)时,link 已创建但仅选择和插入工作。不管怎样,其他的都失败了。

Public Function LinkToSqlTable(sqlInstance As String, sqlDb As String, 
    sqlTableName As String, localTableName As String)  

Dim linked As New TableDef

' ***factored-out functionality, known to work: reader can ignore*** '
DeleteTable localTableName

' connection-string steps, placeholders replaced by args '
Dim sCnx As String
sCnx = "ODBC;Driver=SQL Server;Server=_instance_;" & _
    "Database=_db_;Integrated Security=SSPI"
sCnx = Replace(sCnx, "_instance_", sqlInstance)
sCnx = Replace(sCnx, "_db_", sqlDb)


' linked-table steps '
Set linked = CurrentDb.CreateTableDef(localTableName)
linked.Connect = sCnx
linked.SourceTableName = sqlTableName
CurrentDb.TableDefs.Append linked


' ui '
RefreshDatabaseWindow

End Function

* ID 列或权限? *

我本来以为是身份栏少了,加了一个,没改。至少现在我有一个我应该拥有的PK场。 ;-)

当我手动 link table 时,UI 要求知道 ID 列。那它还能是吗?很好,但是我如何在代码中设置它?搜索没有显示任何内容。

我假设这是网站等所说的权限。我还采取了我能想到的所有步骤来解决这个问题。没有骰子。

* 我试过的东西 *

除了我之前说的 ID 列的东西,这些东西(不按顺序):

(之前的几个选项尝试了较早的选项,但不是 100% 的覆盖率。)

权限问题?毕竟有一些使用 DSN 文件的方法吗?我的 cnx 字符串中的权限设置不匹配?愚蠢的监督?还有什么我错过的吗?我在 SQL Server 和 Access 方面都很擅长,但仅在基本级别的安全性方面和连接字符串是魔鬼。

* 检索到 table 属性 *

为了以防万一,我检索了这些(在将对象添加到 TableDefs 集合之后)。

** 这个,在 UI 中完成,使用 DSN 和 this-is-ID-field,编辑:**

Name = dbo_tblSendTo
Updatable = False
DateCreated = 4/19/2016 11:11:40 AM
LastUpdated = 4/19/2016 11:11:42 AM
Connect = ODBC;Description=SQL Server tables for TeleSales 5;DRIVER=SQL Server Native Client 10.0;SERVER=(local)\sqlexpress;Trusted_Connection=Yes;APP=Microsoft Office 2003;WSID=CMSERVER;DATABASE=TS5_General;
Attributes = 536870912
SourceTableName = dbo.tblSendTo
RecordCount = -1
ValidationRule = 
ValidationText = 
ConflictTable = 
ReplicaFilter = 

** 而这个来自 table link 的代码,没有:**

Name = tblSendTo
Updatable = False
DateCreated = 4/19/2016 11:17:51 AM
LastUpdated = 4/19/2016 11:17:51 AM
Connect = ODBC;Description=SQL Server tables for TeleSales 5;DRIVER=SQL Server Native Client
    > 10.0;SERVER=(local)\sqlexpress;Trusted_Connection=Yes;APP=Microsoft Office 2003;WSID=CMSERVER;DATABASE=TS5_General;
Attributes = 536870912
SourceTableName = dbo.tblSendTo
RecordCount = -1
ValidationRule = 
ValidationText = 
ConflictTable = 
ReplicaFilter =

*我的请求*

所以.....请有人帮助我。我不喜欢这样愚蠢的感觉,遗憾的是我需要这样做而不是用 .NET 代码或类似代码替换它。

谢谢,谁能... 编辑

唉,我可以回答我自己的问题了。

自首次发布回复 HansUp 的评论后进行了一些编辑

我在 table 中添加了一个我无法编辑的标识列。但是,我没有将它设置为主键。事实证明,使用 identity 不会自动将某些内容设为主键。

但是后者,使用两种可能的 DDL 语法中的任何一种使其成为主键,是至关重要的。由于我认为我已经处理了 no edits without unique key 问题,所以我专注于权限。

那么这里所有的权限都只是一个插曲。

这样做的结果是确保添加标识列 并使其成为主键 如果出于某种原因您的原始table 架构没有那个。

如果有时间,我会整理问题以反映我的发现。