【问题标题】:Linked SQL table in Access 2003 (!) not updatableAccess 2003 (!) 中的链接 SQL 表不可更新
【发布时间】:2016-08-12 04:01:04
【问题描述】:

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

要简洁,所以不是 tl;dr.

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

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

* 问题详情如下 *

使用 DSN 和 UI 链接表格,我得到一个可编辑的表格。万岁。

但是当我使用下面的代码(在每个 refsite 上都可以找到)时,会创建链接,但只会选择和插入工作。其他一切都失败了,无论如何都失败了。

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领域。 ;-)

当我手动链接表时,UI 要求知道 ID 列。那么它还能是它吗?很好,但是如何在代码中设置呢?搜索结果一无所获。

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

* 我尝试过的事情 *

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

  • 由于 DSN 保存为文件,因此尝试使用它作为示例,在 cnx 字符串中。失败。
  • 使用 DSN 内容,仔细筛选和翻译,在 cnx 字符串中。失败。
  • 使用了表中的连接字符串,我手动与 DSN 连接。失败。
  • 在所有主要选项中更改了 cnx 字符串中的驱动程序,甚至省略了它。失败。
  • 将 cnx 中的安全更改为 Integrated Security=SSPI 和其他选项,并完全省略。失败。
  • 我添加了我的实际本地用户,例如有密码和没有密码。失败。

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

  • 在 SQL Server 中,使用 SSMS,我尝试了安全功能:
    • 向实例添加了 SQS 身份验证登录
    • 将用户与此处看到的默认数据库匹配
    • 在此处授予该登录用户在 db 中的读写权限(有时还包括其他权限)
    • 在 cnx 字符串中添加了匹配的 id 和 pw。失败。
  • 我尝试在 SQS 中设置这个数据库,让每个人都可以暂时“安全”。失败。

  • 这个,那个,还有其他的。一切都失败了!

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

* 检索到的表属性 *

以防万一他们有帮助,我检索了这些(在将对象添加到 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 = 

** 而这个,来自通过代码链接的表,没有:**

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 代码或类似代码替换它。

谢谢,谁能... 编。

【问题讨论】:

  • 所以,更新,我让它工作了,但它没有真正解决...... 不是真正意味着它工作但我没有'不知道为什么。 “自己消失的东西可以自己回来”,正如 Word 曾经警告我们的那样。 我推测我可能需要将我为它们制作的 DSN 文件放在默认位置。好吧,我设置了它,然后我得到了手动链接表的表属性。
  • 我应用了它们。而这次成功了……!!!所以我不知道这是怎么回事。这是不同且有效的连接字符串,但我仍然很想知道是什么确切使这个工作,而另一个不工作。我很确定其中一些是绒毛,比如“描述=”。 请提供任何专家见解? "ODBC;Description=TeleSales 5 的 SQL Server 表;DRIVER=SQL Server Native Client 10.0;SERVER=(local)\sqlexpress;Trusted_Connection=Yes;APP=Microsoft Office 2003;WSID=CMSERVER;DATABASE=TS5_General;"

标签: permissions sql-server-2008-r2 ms-access-2003 database-permissions


【解决方案1】:

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

在第一次回复 HansUp 的 cmets 后稍作修改

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

但后者,使用两种可能的 DDL 语法中的任何一种使其成为主键,这一点至关重要。因为我认为我已经处理了没有唯一键就不能编辑问题,所以我专注于权限。

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

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

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

【讨论】:

  • 哈,是的。我假设第一次通过添加指定identity 的字段也使其成为DDL 中的PK 字段。所以,生活和学习。我现在添加它,在identity 和通常的not null 之后内联primary key,尽管我知道对于更复杂的用途,我应该使用add constraint 等等。 ...顺便说一句,我很高兴有其他人关注,HansUp。感谢您的评论。我将编辑我的答案以澄清一点。 ...结果是,DDL 并不是我在 SQL 中的强项...迟到总比没有好。
猜你喜欢
  • 1970-01-01
  • 2014-09-12
  • 1970-01-01
  • 1970-01-01
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
相关资源
最近更新 更多