【发布时间】: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