0

我不得不将一个 MS Access 2003/2010 ADP 项目(该项目使用 SQL Server 视图作为其RecordSource所有形式)重新开发为一个 MS Access 2016 ACCDB。

我尝试使用传递查询来获取数据,这对于只读列很好,但是当我想更改其中一个绑定列中的值时,它会说 ,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);

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

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

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

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

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

4

1 回答 1

0

但是为什么所有这些卡车都在工作呢?做所有这些额外工作的理由为零。

只需将表单数据源绑定并设置为视图。假设您将简单地链接客户端上的所有现有视图。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”子句中放入的内容。

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

于 2020-02-27T18:00:40.570 回答