我目前正在使用旧版应用程序,将Access 2003升级为链接到SQL Server表(2008 R2或更高版本)。对于按代码链接的表,我可以插入,但不能更新或删除。我已尝试过网络上的所有内容,没有骰子。详情如下。
简洁而不是tl;博士
首先使用升迁向导创建表。在使用中,app必须连接到同一模式中的不同模式,因此不能只是设置和忘记。虽然可以使用DSN文件,但无法进行本地DSN,许多安装。但问题也存在,DSN没有找到。详情稍后。
在休息之前:很快我将这个应用程序更新到Access 2016左右。如果这个不够/更容易,我会等几天。也许有人可以建议最好的改造。
*问题详情请参阅*
使用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列之外,这些东西(不按顺序):
(之前的几个选项尝试使用之前的选项,但不是100%覆盖率。)
我尝试在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代码或类似代码替换它。
谢谢,任何能够......的人 编
答案 0 :(得分:1)
唉,我能够回答我自己的问题。
自首次发布回复HansUp的评论后编辑了一点
我在表中添加了一个无法编辑的标识列。但是,我没有将设置为主键。事实证明,使用identity
并不能自动创建主键。
但后者使用2种可能的DDL语法中的任何一种使其成为主键是至关重要的。由于我认为我已经处理了没有唯一密钥问题的没有编辑,我专注于权限。
然后,这里的所有权限都只是一个副作用。
这样做的结果是确保添加标识列 并使其成为主键 ,如果由于某种原因您的原始表架构没有那个。
如果我有时间,我会修剪问题以反映我发现的内容。