【问题标题】:How can I create a (server-side) filtered editable SQL recordset for Microsoft Access?如何为 Microsoft Access 创建(服务器端)过滤的可编辑 SQL 记录集?
【发布时间】:2018-04-05 11:44:50
【问题描述】:

我正在 Microsoft Access 中处理一个非常复杂的旧 ADP 项目,该项目连接到 2008 SQL Server 后端。一个常见的使用场景是数据表视图中包含可编辑记录集的表单

大多数数据库使用的方法是加载表单,然后使用表单参数在 VBA 中动态构建 SQL,并将 SQL 应用为表单的RecordSource。许多查询都非常复杂,因此这会导致代码非常丑陋和维护噩梦。

对于只读记录集,我已将动态 sql 转换为参数化存储过程,效果很好。漂亮干净,易于维护。

但对于可编辑的记录集,我正在尝试确定最佳方法:

1.动态 SQL - 如上所述,我真的很想避免这种方法。

2。 SQL 视图 - 这里的挑战是一些表非常大,所以如果我尝试加载视图然后在表单上过滤它,它必须从 SQL 服务器中提取整个记录集,即使我只需要少量的行。 (负面性能和 IO 影响。)

3。使用 context_info - 这听起来很有趣,但听起来不像是基于此处讨论的推荐方法:Create parameterized VIEW in SQL Server 2008 如果我针对 SQL Server 2016 进行开发,我可能会更多地研究 SESSION_CONTEXT

4.带视图的参数表 - 这是我倾向于的想法。我将在 SQL 中创建一个Parameters 表,并使用会话 ID 设置参数值(作为键/值对)。然后,视图将根据参数表中的当前值进行过滤。这将允许我使用视图作为我的RecordSource 来支持编辑,但过滤将在 SQL Server 端进行。

参数表确实是该项目的最佳方法,还是有另一种方法可以访问在服务器端过滤的参数化读写记录集?

【问题讨论】:

  • 这个问题对我来说似乎很广泛且基于观点。为什么不能使用带参数的简单传递查询?如果可维护性很重要,那就更依赖于您的专业知识和准确的设置。
  • @ErikvonAsmuth - 这是一个 ADP 项目,不支持直通查询。您正在 SQL 端直接使用视图和存储过程。
  • 我不是指 DAO 传递查询意义上的传递查询。只是一个设置为参数化查询的 ADODB 记录集。
  • @ErikvonAsmuth - 我不确定我是否完全理解“参数化查询”的含义......如果我使用 SP 作为表单上的记录集,则数据不可编辑。如果我使用视图,我无法设置参数。
  • 只需使用带参数的静态 SQL。您可以将 SQL 保存在模块中的字符串中,或​​者几乎其他任何地方。或者,如果您更喜欢在 SQL Server 中管理查询,您可以使用 TVF 创建可更新的记录集。

标签: sql sql-server-2008 ms-access


【解决方案1】:

我假设你现在谈论的是一个非 adp 项目。

即使您不使用视图,并且说将表单直接绑定到 100 万行的链接表,那么访问也只会拉下您请求的记录。您只需使用打开表单命令的表单“where”子句即可。

所以你甚至不必在这里使用动态 sql。

但是,您不希望启动绑定到大表的表单,除非您设置 where 子句。

你当然可以打开一个没有reordsource的表单,让用户在一个文本框中输入一些参数值,然后去:

Dim strSQL   as string

strSQL = "select * from tblCustomers where InvoiceNum = " &     me.MyInvoiceTextBox

Me.RecordSoruce = strSQL

但是,在大多数情况下,您最好创建某种类型的搜索表单。让用户输入一些值,显示结果如下:

所以在上面,人输入“smi”。你显示结果 (在上面我确实使用了将sql直接填充到表单reocrdsource中的上述方法

现在在侧面的编辑按钮上启动+编辑一条记录, 我只是去:

Docmd.OpenForm "frmCustomer",,,id = & me!id

再一次,即使表单直接绑定到链接的 SQL Server 表,也只会从 SQL Server 中提取 ONE 记录。所以不需要搞乱sql,不需要搞乱参数等。

因此,具有链接表的常规非 ADP 访问应用程序不会拉取整个表。

您还可以在打开表单后设置表单过滤器 - 再次访问只会从链接的 sql 表中提取有问题的记录。访问会拉取所有记录是一个“常见”神话——如果您提供过滤器,它不会,我建议您打开一个表单到一个记录,让用户工作然后关闭表单并返回到某个搜索屏幕您准备好与下一位客户等进行战斗了。

因此,请提供一个搜索表单 - 不建议让用于编辑数据的表单与搜索记录的功能杂乱无章。让用户编辑,然后关闭表单 - 这也促进了用户完成工作后保存的记录。

编辑: 对于具有任何类型的复杂连接等的表单,然后创建一个视图,并将表单绑定到该视图。您使用表单“where”子句,然后再次访问只会拉下一条记录。因此,对于复杂的连接等,是的,访问通常会使查询混乱并且运行缓慢。因此,如果表单绑定到一个表(即大多数情况下),则将表单直接绑定到链接表。如果 sql 很复杂,则将表单绑定到链接视图,并且如在任何一种情况下所指出的,始终为 openform 命令提供“where 子句” - 在这些情况下,它只会将一条记录拉入表单。再一次,在访问端不需要杂乱的参数,也不需要杂乱的 sql - 如果采用这种方法,您将节省大量的编码,并且由于您限制了从 sql server 拉入该表单的记录,您还将获得出色的性能。

【讨论】:

  • 谢谢,阿尔伯特!不知道我是如何忽略该选项的,但DoCmd.OpenForm 中的Where 子句应该满足大多数情况下的需要。非常感谢您花时间详细说明此答案。
猜你喜欢
  • 1970-01-01
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 2020-12-18
  • 2013-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多