如何为Microsoft Access创建(服务器端)筛选的可编辑SQL记录集?

如何为Microsoft Access创建(服务器端)筛选的可编辑SQL记录集?,sql,sql-server-2008,ms-access,Sql,Sql Server 2008,Ms Access,我正在Microsoft Access中从事一个非常复杂的遗留ADP项目,该项目连接到2008 SQL Server后端。常见的使用场景是数据表视图中包含可编辑记录集的表单 大多数数据库使用的方法是加载表单,然后使用表单参数在VBA中动态构建SQL,并将SQL应用为表单的RecordSource。许多查询都相当复杂,因此这会导致非常难看的代码和维护噩梦 对于只读记录集,我已将动态sql转换为参数化存储过程,效果非常好。美观干净,易于维护 但是对于可编辑的记录集,我正在尝试确定最佳方法: 1。动态

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

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

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

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

1。动态SQL-如上所述,我确实希望避免这种方法

2。SQL View-这里的挑战是一些表非常大,因此如果我尝试加载视图,然后在表单上对其进行筛选,它必须从SQL server中提取整个记录集,即使我只需要少量行。(负面性能和IO影响。)

3。使用
context\u info
-这听起来很有趣,但听起来不像是基于此处讨论的推荐方法:如果我是针对SQL Server 2016开发的,我可能会更深入地研究

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


参数表真的是该项目的最佳方法吗?还是有其他方法可以访问在服务器端过滤的参数化读写记录集?

我假设您现在谈论的是非adp项目

即使您不使用视图,比如说将表单直接绑定到包含一百万行的链接表,access也只会下拉您请求的记录。只需使用openform命令的forms“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中提取一条记录。因此,不需要搞乱SQL,也不需要搞乱参数等

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

您还可以在打开表单集后设置表单过滤器,access也只能从链接的sql表中提取有问题的REOCRD。这是一个“常见的”access会拉取所有记录的谬论——如果您提供了一个过滤器,则不会拉取所有记录,我建议您打开一个表单,然后让用户工作,然后关闭表单并返回到某个搜索屏幕,在该屏幕中,您准备好与下一个客户进行斗争,等等

因此,提供一个搜索表单-不要建议编辑数据的表单由于搜索记录的能力而变得杂乱无章。让用户编辑,然后关闭表单-这也会在用户完成工作后促进记录的保存

编辑:
对于具有任何类型的复杂联接等的窗体,然后创建一个视图,并将窗体绑定到该视图。使用forms“where”子句,则access将再次仅下拉一条记录。因此对于复杂联接等,是的access通常会使查询混乱,运行速度较慢。因此,如果窗体绑定到一个表(大多数情况下),然后将表单直接绑定到链接表。如果sql比较复杂,则将表单绑定到链接视图,并且如前所述,始终提供“where子句”对于openform命令—在这些情况下,它只会将一条记录拉入表单。而且,再次强调,在访问端不需要混乱的参数,也不需要混乱的sql—如果采用这种方法,您将节省大量的编码,而且您还可以获得优异的性能,因为您限制了从sql server拉入该表单的REOCRD

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