Access 2003(!)中的链接SQL表不可更新



我目前正在一个遗留应用程序中工作,正在升级Access 2003以链接到SQL Server表(2008 R2或更高版本)。通过代码链接的表,我可以插入,但不能更新或删除。我在网上什么都试过了,没有骰子。详细信息如下。

简洁所以不是tl;dr

首次使用升迁向导创建的表。在使用中,应用程序必须连接到同一架构中的不同应用程序,所以不能只是设置并忘记。无法执行本地DSN,许多安装,尽管DSN文件是可能的。但也存在问题,DSN找不到。详细信息请稍后查看。

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

*问题详情如下*

使用DSN和UI链接表,我得到了一个可编辑的表。Hurray。

但当我使用下面的代码(在每个参考网站上都可以找到)时,链接是建立的,但只是选择和插入工作。其他一切都会失败,不管怎样。

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中的安全性更改为IntegratedSecurity=SSPI和其他选项,并完全省略。失败
  • 我添加了我的实际本地用户作为示例,有密码和没有密码。失败

(之前的几个选项在之前的选项中进行了尝试,尽管不是100%覆盖。)

  • 在SQL Server中,使用SSMS,我尝试了安全功能:
    • 向实例添加了SQS身份验证登录
    • 将用户与此处显示的默认数据库匹配
    • 在这里给登录用户在数据库中的读写权限(有时还有其他权限)
    • 添加了匹配的id&pw到cnx字符串。失败
  • 我试着在SQS中设置这个数据库,让每个人暂时"安全"地做所有事情。失败

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

那么是权限问题吗?究竟有什么方法可以使用DSN文件?我的cnx字符串中的权限设置不匹配?愚蠢的疏忽?我还错过了什么?我非常擅长SQL Server和Access,但只有在基本级别上,它们的安全性和连接字符串才是魔鬼。

*检索到的表属性*

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

**这是在UI和DSN中完成的,这是ID字段,用于编辑:**

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

谢谢,任何能。。。编辑

唉,我能回答我自己的问题了

自第一次发布以来编辑了一点,以回复HansUp的评论

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

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

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

这样做的结果是,如果由于某种原因,您的原始表架构没有标识列,请确保添加标识列并将其作为主键

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

最新更新