我目前正在一个遗留应用程序中工作,正在升级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语法中的任何一种使其成为主键,是至关重要的。由于我认为我已经处理了没有唯一键就不能编辑的问题,所以我把重点放在了权限上。
那么,这里所有的权限都只是一个小插曲。
这样做的结果是,如果由于某种原因,您的原始表架构没有标识列,请确保添加标识列并将其作为主键。
如果我有时间,我会调整这个问题,以反映我的发现。