【问题标题】:Read/Write SQL Server views in MS Access using SCHEMABINDING使用 SCHEMABINDING 在 MS Access 中读/写 SQL Server 视图
【发布时间】:2020-06-10 13:26:15
【问题描述】:

我不得不将一个 MS Access 2003/2010 ADP 项目重新开发为 MS Access 2016 ACCDB,该项目使用 SQL Server 视图作为其所有表单的RecordSource

我尝试使用传递查询来获取数据,这对于只读列来说很好,但是当我想更改其中一个绑定列中的值时,它会说RecordSet is not updateable,这就是你可能的如果使用视图,则期望。

但我现在已经读到,如果您像这样使用 SCHEMABINDING 定义视图:

ALTER VIEW [dbo].[vwQuote_MinibusesDetails]
WITH SCHEMABINDING
AS
    SELECT ...

并像这样添加UNIQUE CLUSTERED INDEX

CREATE UNIQUE CLUSTERED INDEX CIX_vwQuote_MinibusesDetails
ON vwQuote_MinibusesDetails (txtQuoteNo, txtVersion, txtVehicleNo);

然后像这样将视图作为无 DSN TableDef 添加到您的项目中

stConnect = "ODBC;Driver=SQL Server;Server=" & SERVER_NAME & ";Database=" & APP_DATABASE & ";Trusted_Connection=Yes"
Set td = CurrentDb.CreateTableDef(stLocalTableName, dbAttachSavePWD, stRemoteTableName, stConnect)
CurrentDb.TableDefs.Append td

它变得像表格一样可编辑。

但是,当我在 Access 中打开 TableDef 时,它会显示所有行和列,就好像它是可编辑的一样,但是如果我尝试编辑列,它会说有一个 Write Conflict 带有另一个用户的更改,当我 100% 确定没有因为我是唯一使用它的人时。

有什么想法吗? (我目前正在使用 Access 2010)

【问题讨论】:

  • 您可能会更幸运地将表(而不是视图)添加为链接表并尝试在 Access 数据库中更新它们。
  • Note:Access 2010 是支持使用 Access 项目 (.adp) 文件的最后一个 Access 版本。此外,它最适用于 SQL Server 2008 或更早版本。而且这个 SQL Server 版本已经过了它的end of life support。考虑重新设计您的产品和工作流程。

标签: sql sql-server ms-access indexing schemabinding


【解决方案1】:

但是为什么要完成这么多卡车的工作呢?做所有这些额外工作的理由为零。

只需将表单数据源绑定并设置为视图。假设您将简单地链接客户端上的所有现有视图。 Access 将因此将所有视图视为简单的表,并且视图(与传递查询相反)是读/写的。

所以,没有必要: 在您的代码中有任何连接字符串。如果您在代码中使用连接字符串,那么您的方法都是错误的。只需链接到视图,并将表单数据源设置为该视图。

此时,表单可以编辑数据了。

至于驱动组合框的直通查询?不要这样做。虽然 PT 查询可能是提取数据的最快方式,但访问客户端无法过滤 PT 查询。因此,您只希望在客户端不必过滤结果的情况下使用 PT 查询。如果您将组合框绑定到 PT 查询,则 Access 需要并且只想从该表中提取一个值以进行显示。由于访问客户端无法过滤 PT 查询,因此它将扫描整个数据源以查找该组合框以获取当前显示的一个值。如果您对驱动组合框的源使用链接表(甚至视图),则访问客户端可以将该数据集过滤到 ONE 行。因此,对于需要客户端过滤的任何情况,都不要使用 PT 查询。在这些情况下,链接视图(或链接表)就可以了。

因此,只需将表单直接绑定到链接表或链接视图。

如果表有 100 万行数据,而你说这样做:

Docmd.OpenForm "frmInvoice",,,"InvoiceNum = 1234"

Access 将打开表单以显示一行数据,并且仅从网络管道中拉出一行。尽管有问题的表单绑定到 100 万行的表。表单将立即加载,您无需编写任何 sql、任何连接内容,也无需做任何与开发典型访问应用程序不同的事情。

绑定表单是 Access 节省大量开发资金的方式和原因。如果您跳转到 .net,那么您将拥有各种可以帮助您解决此问题的工具和向导。所以在 .net 中,你可以采用数据集设计器,或者使用更新的实体框架。

在 Access 中,我们没有这个包含数据设计器和工具的庞大工具箱,因此,如果您尝试手动编写代码,并为表单的数据源编写代码,那么您可能会得到最糟糕的结果(您编​​写了大量代码,并且没有所有用于未绑定表单的酷工具)。

只需将您的表单链接到链接的表(或视图),您现在就有了一个无需任何代码的工作数据绑定表单。如果您需要加载表单,则使用 open form 命令的“where”子句的 20+ 年标准方法将表单打开到一条记录。访问客户端只会提取您在“where”子句中放入的内容。

因此,要连接用于编辑数据的表单,需要零代码。然后,唯一的开发人员将确保表单不会将不必要的数据拉到客户端。

【讨论】:

  • 如何在不使用某种连接字符串的情况下链接到视图?这不是我桌面上的自制软件,它是一个必须通过所有 SQL Server 登录安全性的商业系统。我必须使用“TrustedConnection=Yes”,如果我这样做,那么视图是只读的。我将尝试使用 Ben B 的建议链接到基表而不是视图,因为大多数视图似乎只是从它们各自的单个基表中选择字段——尽管这本身就是一个数据可见性安全问题,但由于该应用仅供内部使用,应该没问题。
  • 好的,如果我使用“TrustedConnection=Yes”链接基表,那么它们可以在 Access 查询窗口中编辑。下一个问题是 Access 是否允许我将它们用作表单 DataSource(例如,PassThrough 查询不能用作表单 DataSource),然后我将讨论是否使用“tbl”保持严格的匈牙利表示法" 前缀或给链接表一个 "vw" 前缀以最小化代码更改...
  • 您的重新链接代码或使用链接表管理器需要连接字符串。但您的代码中不需要连接字符串。因此,您在“一般”中不需要在代码中“到处”连接字符串,这一点就是这里的重点。指向 sql 表的链接和指向视图的链接都是读/写的,都可以用作表单的直接数据源。 (同样,您的表单代码中不需要连接字符串)。当您链接到视图时,系统会提示您输入 PK。如果您的重新链接代码创建了指向视图的链接,则需要设置 PK 的额外步骤。
  • 基于访问客户端查询的表单或基于服务器端视图的此类表单的好处为零(浪费开发人员时间)。只需链接到表,然后将表单基于该链接表。对于子表单,您可以使用带有排序的视图,甚至可以在需要时使用客户端查询进行排序。对于报告,如果一个表,客户端 sql 查询就可以了。对于多个 SQL 连接,然后将查询移动到服务器端视图并将报告基于该视图。视图将尊重打开表单或打开报告的“where”子句。视图的性能与传递查询一样好。
  • 至于改变符号和表名?为什么?保持它们与以前一样,因此所有现有的 VBA 代码将倾向于像以前一样工作,并且尽可能少地进行更改。如果您更改表名,那么现在将破坏一卡车的 sql 和查询。您的目标是尽可能少地进行更改,而表名等的每次更改都会花费您的时间和精力。
猜你喜欢
  • 2020-02-10
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-12
  • 1970-01-01
相关资源
最近更新 更多