在 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 列的东西,这些东西(不按顺序):
- 由于 DSN 已保存为文件,因此尝试在 cnx 字符串中作为示例使用它。失败。
- 使用的 DSN 内容,经过仔细筛选和翻译,采用 cnx 字符串。失败。
- 使用了 table 中的连接字符串,这是我通过 DSN 手动连接的。失败。
- 更改了所有主要选项中 cnx 字符串中的驱动程序,甚至省略了它。失败。
- 将 cnx 中的安全性更改为 Integrated Security=SSPI 和其他选项,并完全省略。失败。
- 我按照示例添加了我的实际本地用户,有密码和没有密码。失败。
(之前的几个选项尝试了较早的选项,但不是 100% 的覆盖率。)
- 在SQL服务器中,使用SSMS,我尝试了security power:
- 为实例添加了 SQS 身份验证登录
- 将用户与此处看到的默认数据库匹配
- 在此处授予该登录用户在数据库中的读写权限(有时加上其他权限)
- 在 cnx 字符串中添加了匹配的 ID 和密码。失败。
我尝试在 SQS 中设置此数据库,让每个人都可以暂时做所有事情 "security"。失败。
这个,那个,还有其他的。一切都失败了!!
权限问题?毕竟有一些使用 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 架构没有那个。
如果有时间,我会整理问题以反映我的发现。
我目前正在使用旧版应用程序,将 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 列的东西,这些东西(不按顺序):
- 由于 DSN 已保存为文件,因此尝试在 cnx 字符串中作为示例使用它。失败。
- 使用的 DSN 内容,经过仔细筛选和翻译,采用 cnx 字符串。失败。
- 使用了 table 中的连接字符串,这是我通过 DSN 手动连接的。失败。
- 更改了所有主要选项中 cnx 字符串中的驱动程序,甚至省略了它。失败。
- 将 cnx 中的安全性更改为 Integrated Security=SSPI 和其他选项,并完全省略。失败。
- 我按照示例添加了我的实际本地用户,有密码和没有密码。失败。
(之前的几个选项尝试了较早的选项,但不是 100% 的覆盖率。)
- 在SQL服务器中,使用SSMS,我尝试了security power:
- 为实例添加了 SQS 身份验证登录
- 将用户与此处看到的默认数据库匹配
- 在此处授予该登录用户在数据库中的读写权限(有时加上其他权限)
- 在 cnx 字符串中添加了匹配的 ID 和密码。失败。
我尝试在 SQS 中设置此数据库,让每个人都可以暂时做所有事情 "security"。失败。
这个,那个,还有其他的。一切都失败了!!
权限问题?毕竟有一些使用 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 架构没有那个。
如果有时间,我会整理问题以反映我的发现。