我有一个用于数据输入的访问前端用户表单,该表单链接到带有ODBC连接的SQL Server后端。用户当前正在使用Access中的“查找记录”功能来查找数据记录,但随着表中记录数量的增加,此过程变得相当慢。我知道有一种更有效的查找记录的方法,我相信让SQL Server完成工作而不是Access,但我找不到任何描述最佳方法的东西。谢谢!
答案 0 :(得分:1)
当然,在表单上执行某些过滤器是太晚了,因为你只能过滤表格已经加载的内容!
这里最好的方法是去一个公共汽车站,向一位90岁的女士寻求建议。她的回答将为您提供解决方案并解决这个问题。
所以让我们首先向90岁的女士提出以下问题:
当您使用即时柜员机时,即时柜员机是否有意义下载所有帐户,然后询问您要使用哪个帐户?
老太太会回答:这真的很愚蠢 - 你想问一下什么帐号可以工作然后下载一个账号!
当您使用Google搜索互联网时也是如此 - 您不会将WHOLE互联网下载到您的计算机中,然后使用ctrl-f搜索下载到该网络浏览器中的所有内容。
因此,在Access的情况下,如果您使用表单过滤器,或使用ctrl-F,那么您只能搜索表单已从SQL服务器下载的内容。因为巴士站的老太太会告诉你这很疯狂,如果你曾经使用谷歌,或者只是使用任何其他软件,那么KEY CONCEPT是首先询问用户想要搜索的内容,然后根据该请求下载结果
所以不要将所有或甚至任何记录下载到用于搜索的表单中,直到您知道要搜索的内容为止!
事实上,表单应该开始取消绑定(没有数据源)。然后,您可以简单地在表单顶部附近放置一个文本框,并允许用户输入姓氏(或者只是该姓氏的前几个字符)。然后,您可以显示搜索结果,例如看起来像此访问表单的继续表单:
注意上面的用户输入“Smi”(正在寻找史密斯)。
因此,即使在该文本框中更新后的代码也是如此:
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 Server的记录。
因此,每次只需从头开始搜索SQL,然后将STUFF表示为SQL到表单记录源 - 结果是访问只会从SQL服务器中提取这些记录 - 而且它会发生得相当快 - 即使对于大型表也是如此。 (当然假设您有为快速搜索编制索引的公共列)
正如您在上面的Access示例中所看到的,搜索已经发生,并且显示了结果的“列表”。在上面我们还提供了一个“编辑”按钮来编辑一条记录。因此,在上面,用户可以单击该按钮,然后打开编辑表单以编辑"详细信息"那条记录。只要我们使用表单“where子句”,那么该表单只加载一个记录,因此再次启动该表单来编辑一个记录将立即发生 - 即使对于1或5百万行的表。
请注意,此编辑表单可以直接绑定到您拥有的巨大链接表。 “where”子句将限制为您拉取的数据,并且只有拉出一条记录,尽管该表格绑定到大表。
因此,在“眼镜”按钮后面按照上面加载的只有1条记录来启动表单的跟随代码,以编辑一条记录,如下所示:
dim strWhere as String
strWhere = "ID = " & me!ID
docmd.OpenForm "frmCustomers",,,strWhere
答案 1 :(得分:0)
SQL传递查询用于将命令直接发送到SQL Server。通过使用SQL传递查询,您可以直接使用服务器表,而不是让Microsoft Jet数据库引擎处理数据。
以下是Microsoft文章的链接,其中显示了如何在Access中创建SQL传递查询:https://support.microsoft.com/en-us/kb/303968
我希望这会有所帮助。