使用链接表访问连续表单 - 如何避免表单中的每一行都访问数据库服务器?

2023-11-30

我正在通过 SQL Server 迁移助手 (SSMA) 将数据从 Access 数据库迁移到 SQL Server。 Access 应用程序将继续与转换为链接表的本地表一起使用。

加载时,一份连续的表单会挂起 15 - 30 秒。它显示大约 2000 条记录。当我查看 SQL Server Profiler 查看它在做什么时,它正在为表单中的每条记录单独调用后端数据库。因此,表单打开时的延迟是由对数据库的 2000 多次单独调用造成的。

这是非常低效的。有什么方法可以让Access对后端数据库进行一次调用并立即检索所有记录吗?

我不知道这是否相关,但表单的记录源是 SQL Server 后端数据库中的一个视图,它通过 Access 链接表链接到(因此,希望 Access 只是将其视为一个表,而不是一个表)看法)。我需要在 SQL Server 中的视图上使用 Replace Of 触发器,并在 Access 中的链接表上使用唯一索引,以允许通过表单更新记录。


如果打开连续表单的行为确实生成了大约 2000 个单独的 SQL 查询(视图中的每一行一个查询),那么这对于 Access 与 SQL Server 链接“表”交互来说是不寻常的行为。正常情况下发生的情况是:

  • Access 提交单个查询以返回表/视图中所有行的所有主键值。该查询可以根据其他列进行过滤和/或排序Filter and Order By表单的属性。这将为 Access 提供可能在表单中显示的每一行的键值列表(按照它们出现的顺序)。

  • 然后 Access 使用以下命令创建 SQL 准备好的语句sp_prepexec一次从表/视图十 (10) 行中检索整行。第一个电话看起来像这样......

    declare @p1 int
    set @p1=4
    exec sp_prepexec @p1 output,N'@P1 int,@P2 int,@P3 int,@P4 int,@P5 int,@P6 int,@P7 int,@P8 int,@P9 int,@P10 int',N'SELECT "ID","AgentName" FROM "dbo"."myTbl" WHERE "ID" = @P1 OR "ID" = @P2 OR "ID" = @P3 OR "ID" = @P4 OR "ID" = @P5 OR "ID" = @P6 OR "ID" = @P7 OR "ID" = @P8 OR "ID" = @P9 OR "ID" = @P10',358,359,360,361,362,363,364,365,366,367
    select @p1

    ...并且每个后续调用都使用sp_execute,像这样的

    exec sp_execute 4,368,369,370,371,372,373,374,375,376,377

  • Access 会重复这些调用,直到检索到足够的行来填充连续表单的当前页面。然后它立即显示这些表单。

  • Once the forms have been displayed, Access will "pre-fetch" a couple of more batches of rows (10 rows each) in anticipation of the user hitting PgDn or starting to scroll down.

  • If the user clicks the "Last Record" button in the record navigator, Access again uses sp_prepexec and sp_execute to request enough 10-row batches to fill the last page of the form, and possibly pre-fetch another couple of batches in case the user decides to hit PgUp or start scrolling up.

因此,在您的情况下,如果 Access 确实导致 SQL Server 对视图中的每一行运行单独的查询,那么您的 SQL 视图可能存在某些特殊情况导致它。您可以通过创建一个到单个 SQL 表或简单的单表 SQL 视图的 Access 链接表来测试这一点,然后使用 SQL Server Profiler 检查打开该链接表是否会导致相同的行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用链接表访问连续表单 - 如何避免表单中的每一行都访问数据库服务器? 的相关文章

  • 捕获 Unicode 文本(西里尔文)并将其插入 MS Access 数据库

    我继承了一个旧的 Web 应用程序 该应用程序使用经典 ASP 将表单中收集的数据写入 Access 2007 数据库 现在他们需要它能够收集西里尔字母的输入 我完全不熟悉代码页 字符集 也不熟悉非拉丁字母 我尝试将输入表单页面上的字符集更
  • 无法删除 Microsoft Access 2003 中的主 -> 子子表单链接

    我在删除访问子报表数据表单中的主 gt 子链接字段时遇到问题 我尝试了各种方法来删除它们 使用子报表的属性窗口以及链接向导 我还从数据库中删除了子报表 然后将现有对象重新导入到新的访问实例中 一旦我重新添加子表单并将其命名为相同的名称 链接
  • 我们可以使用sql列出MS Access数据库中的所有表吗?

    我们可以使用 sql 找到 ms access 中的所有表吗 就像我们在 sql server 中所做的那样 select from sys tables 在sqlite中 SELECT FROM sqlite master where t
  • 在 Access VBA 中获取 Combobox.Value

    我有这个代码 If Me Combobox Value My Text Then 然而 由于我想测试 我的文本 是否是唯一选择的值 因此跳过了条件 我也尝试过 Me Combobox Column 1 and Me Combobox Tex
  • 将 Excel 文件导入 Access 时更改数据类型

    将 Excel 文件导入 Access 时 有什么方法可以更改默认数据类型吗 顺便说一下 我使用的是 Access 2003 我知道有时我可以自由地将任何数据类型分配给正在导入的每个列 但这只能在我导入非 Excel 文件时进行 EDIT
  • 通过 VBA MS_Access 将 MS Access 表导出为 dBase 5

    如何通过 VBA 将单个表导出为 dBase 5 文件 目前我正在使用这个VBA代码 DoCmd TransferDatabase acExport dBase IV DB Total acTable DB Total C Data Fal
  • 将 Mdb 转换为 Sql Server

    如何使用 C 或其他语言将 mdb 访问文件转换为 sql server 我找到了一个article http channel9 msdn com forums TechOff 234266 Convert MS Access DB to
  • 查询从同一表中的另一条记录获取值并按大于间隙阈值的差异进行过滤

    我将数据导入到 MS Access 中的临时表中 如下所示 我添加了需要使用 SQL 查询计算的 Gap 和 Previous Current 列 间隙阈值 是用户输入或范围提供给查询和例如是 300 GlobalID 对 ItemID 进
  • 规范化现有的 MS Access 数据库

    我有一个大型访问数据库 需要将其规范化为五个表和一个查找表 我了解标准化背后的理论 并且已经勾勒出表格的外观 但我不知道如何转换我的表格以使数据库标准化 表分析器没有提供我想要的细分 如果您只有一个表 请向其中添加自动编号字段 然后创建其他
  • 滞后分区相当于 MS Access

    我正在寻找 MS Access 中以下 Oracle 查询的等效项 我知道 Lag Over Partition by 功能在 MS Access 中不可用 但希望使用 MS Access 实现以下查询的相同功能 感谢任何输入 select
  • 在 Access DB 中对字符串进行排序

    我有一个带有字段版本的数据库 可能有许多记录具有相同的版本字符串 因此要提取我拥有的版本 我执行以下操作 SELECT DISTINCT tblSample Version FROM tblSample ORDER BY tblSample
  • 使用多个值更新查询

    我想在 MS Access 2003 中编写一个更新查询 我有一个名为product code 如果产品代码是 110 到 752 之间 或 910 到 1124 之间 我想更新产品代码 15 如果产品代码是 1210 和 1213 之间
  • 将 MS Access 连接到网络上的 SQL Server

    我在 Windows 服务器上安装了 SQL Server Express 我有 10 个人在本地 PC 上安装了 MS Access 2016 假设数据库非常小且简单 连接 SQL Server 最简单的方法是什么 简单的 ODBC 可以
  • MS-Access:查询生成重复事件的日期?

    我不太熟悉更复杂的查询 并且在寻找一些示例来分解以利用时遇到问题 Event Name Due Date Frequency Frequency UOM S XYC 001 10 17 2020 360 D S XYA 003 6 1 20
  • 使用 MS Access 在 Excel VBA 中运行代码

    我使用访问前端从 SQL Server 中提取查询 然后 我将记录集导出到新的 Excel 工作簿 然后我想使用 Excel 运行 Access 中的代码 它只是循环遍历单元格并添加格式并检查特定值 我可以从访问权限运行它 它将让工作簿打开
  • 操作必须使用可更新的查询 - 访问

    我想通过使用 access 2007 中的联接来更新表 UPDATE TABLE1 A INNER JOIN SELECT ACCODE SUM AMOUNT AS SUM AMOUNT FROM TABLE2 GROUP BY ACCOD
  • 无法使用 RODBC 附加到具有自动编号列的表

    我正在尝试使用 RODBC 将新行插入到 Microsoft Access 数据库中的表中 问题是主键列是一个自动编号 它似乎不允许我省略此列 我正在使用带有append TRUE 的sqlSave 函数和带有单行的数据框 我已经尝试过以下
  • 从网站上的表格中抓取数据,而无需搜索标签

    这是这个问题的延续使用 InStr 搜索引号 空格 冒号等 https stackoverflow com questions 52673819 using instr to search for quotes spaces colons
  • MS Access 中重命名列的 DDL 是什么?

    在 MS Access 中重命名列的 DDL 是什么 大致如下 alter table myTable rename col1 to col2 它不适用于 MSAccess 2000 格式的数据库 我正在将 OLEDB 或 ADO NET
  • 使用 MS Access 获取行的第一个实例

    EDITED 我有这个查询 我想SELECT表中记录的第一个实例petTable SELECT id pet ID FIRST petName First Description FROM petTable GROUP BY pet ID

随机推荐