【问题标题】:Efficient way to replace find loan in Access with SQL Server back-end用 SQL Server 后端替换 Access 中的查找贷款的有效方法
【发布时间】:2017-01-10 16:55:38
【问题描述】:

我有一个用于数据输入的访问前端用户表单,该表单通过 ODBC 连接链接到 SQL Server 后端。用户目前正在使用 Access 中的“查找记录”功能来查找数据记录,但是随着表中记录数量的增加,这个过程变得相当缓慢。我知道有一种更有效的方式来查找记录,我相信通过让 SQL Server 完成工作而不是 Access,但我无法找到任何描述最佳方式的东西。谢谢!

【问题讨论】:

  • 过滤器是最好的。我使用了一个小型查找表单,它使用 SQL 过滤记录。

标签: sql-server ms-access vba


【解决方案1】:

当然,在表单上执行某些过滤器为时已晚,因为您只能过滤表单已加载的内容!

这里最好的方法是去公共汽车站向一位 90 岁的老太太征求意见。她的回答会给你这个问题的解决方案和答案。

所以我们先问那个 90 岁的老太太以下问题:

当您使用即时取款机时,即时取款机下载所有帐户然后询问您要使用哪个帐户是否有意义?

老太太会回答:那真是愚蠢——你想问用什么帐户工作然后下载一个帐户!

当您使用 Google 搜索互联网时也是如此 - 您不会将整个互联网下载到您的计算机中,然后使用 ctrl-f 搜索下载到该网络浏览器中的所有内容。

所以在 Access 的情况下,如果你使用表单过滤器,或者使用 ctrl-F,那么你只能搜索表单已经从 SQL 服务器下载的内容。因为公交车站的老太太会告诉你这太疯狂了,如果你曾经使用过谷歌或任何其他软件,关键概念是首先询问用户想要搜索的内容,然后根据该请求下载结果.

因此,在您知道要搜索什么之前,不要将所有甚至任何记录下载到用于搜索的表单中!

该表单实际上应该从未绑定(没有数据源)开始。然后,您只需在表单顶部附近放置一个文本框,并允许用户输入姓氏(或仅输入该姓氏的前几个字符)。然后,您可以以类似于以下访问表单的持续表单显示搜索结果:

请注意上面用户如何输入“Smi”(正在寻找 smiths)。

所以即使是那个文本框的更新后的代码也会是这样的:

dim strSQL   as string

strSQL = "select * from tblCustomer where LastName Like "'" & me.txtLastName & "*'"
me.RecordSource = strSQL

因此,您只需将带有用户搜索条件的 SQL 填入“数据源”表单即可。在这种情况下,如果该数据库有 100 万行或 1000 万行,则只提取请求的记录。此类搜索通常会在不到一秒的时间内完成——即使对于具有数百万行的大型表也是如此。

所以不要使用过滤器——因为它只能过滤您下载到该表单中的现有记录。并且不要使用 ctrl-f 进行搜索,因为那样只能搜索已经下载到表单中的记录。然而,在上面的表格中,ctrl-f(内置的 Access 搜索)可用于搜索基于 smith 搜索的 50 个左右的匹配项 - 因此我们可以在提取批次后向下钻取并跳转到说出给定的名字来自 SQL 服务器的记录。

因此,每次从头开始搜索时只需形成 SQL 并将该 SQL 填充到表单记录源中 - 结果是访问只会从 SQL 服务器中提取这些记录 - 而且它会很快发生 - 即使对于大型表也是如此。 (当然假设您有为快速搜索建立索引的公共列)

正如您在上面的 Access 示例中看到的,搜索已经发生,并显示了一个结果“列表”。在上面我们还提供了一个“编辑”按钮来编辑一条记录。所以在上面用户可以点击那个按钮,我们打开编辑表单来编辑那个记录的“细节”。只要我们使用表单“where 子句”,那么该表单只加载一条记录,因此再次启动该表单以编辑一条记录将立即发生——即使对于 1 或 500 万行的表也是如此。

请注意,此编辑表单可以直接绑定到您拥有的巨大链接表。 “where”子句将限制为您提取的数据,并且仅提取一条记录,尽管该表单已绑定到大表。

因此,在“眼镜”按钮后面启动仅加载 1 条记录的表单的以下代码如下所示:

 dim strWhere   as String

 strWhere = "ID = " & me!ID

 docmd.OpenForm "frmCustomers",,,strWhere

【讨论】:

  • 我不是在填写表格后建议使用过滤器,而是建议首先使用过滤器来获取数据,因此使用 SQL。使用 SQL Server 时,过滤器是最好的选择,即使是在已经填写的表单上。
【解决方案2】:

SQL 传递查询用于将命令直接发送到 SQL Server。通过使用 SQL 传递查询,您可以直接使用服务器表,而不是让 Microsoft Jet 数据库引擎处理数据。

这里是 Microsoft 文章的链接,其中显示了如何在 Access 中创建 SQL 传递查询:https://support.microsoft.com/en-us/kb/303968

我希望这会有所帮助。

【讨论】:

  • 您可以将 UPDATE 与传递查询一起使用。见stackoverflow.com/questions/21418766/…
  • 当然,PT update QUERY 可以更新表,但这样的查询不是请求数据或将数据返回给 Access 客户端。因此,绑定到 PT 查询的任何表单都是只读的,VBA 代码中的任何记录集都是只读的。并且任何到 PT 查询的链接表也是只读的。因此,开发人员用于处理数据的 Access 工具箱中的几乎所有实用工具都将是只读的。但是,公平地指出例外是 PT 更新查询,其中一个更新数据并且不请求访问对象(例如表单/记录集等)的读/写数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
  • 2013-06-24
  • 2016-06-27
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多