SQL Server 延迟问题

Posted

技术标签:

【中文标题】SQL Server 延迟问题【英文标题】:SQL Server Delay Problem 【发布时间】:2009-07-06 20:12:52 【问题描述】:

我刚刚将 ACCESS 数据库(后端)导入到 SQL Server 2008 数据库。我的前端仍然是 ACCESS 2007,后端是 SQL Server 2008。我意识到,如果我打开一个表单(在某条记录上)然后进行一些应该填写一些文本字段的计算自动在该表单上(对于该记录),那么那些文本字段的值此时不会填写。现在,如果我关闭表单并为同一条记录重新打开它,值就在那里。所以就像延迟一样,这阻止了其他事情的发生。有人可以帮我解决这个问题吗?我尝试使用 ODBC 驱动程序 SQL Server 以及 SQL Server Native Client 10.0,但它们都不起作用。

非常感谢

【问题讨论】:

你是怎么计算的?是基础查询中的公式、文本框中的公式还是要计算的 VBA 代码。 【参考方案1】:

对于服务器后端,Access 需要帮助以使表单保持最新。首先,每个表都需要一个主键(没有设计得当的表缺少主键,但这可能是一种适用于 Jet 并在升级到 SQL Server 或任何其他 ODBC 后端时中断的东西)。其次,我发现向所有 SQL Server 表添加时间戳字段是一种很好的做法,因为这样可以让 Access 知道记录是否已更新,而无需评估记录中的每个字段。这也使得 Access 可以在不做太多额外工作的情况下刷新表单中的显示缓冲区。

【讨论】:

【参考方案2】:

当使用本地表或链接到 sql server 的表时,表单中的大多数功能都一样。

然而,这里的一个显着区别是,即使您在添加模式下开始编辑表单中的信息,主键也会在本地表单中添加 INSTANLTY。这意味着如果有任何类型的查找,甚至可能是子表单,或其他基于使用主键的表达式,当您运行本地版本的 MS access 并开始输入时,这些显示将立即更新。

但是,当使用链接表到 SQL Server 时,在实际保存记录之前不会生成自动编号主键 ID。因此,您应该检查这些表达式是否使用并依赖主键来显示信息。

如果上述问题是您的问题,那么也许在用户常见的输入数据的控件之一中,您强制执行磁盘写入(从而强制生成主键)。

因此,在您输入的主要文本框(字段)的“更新后”事件中,您可以强制进行磁盘写入,例如:

If isnull(me!id) = true then
   ‘ we have no primary key, force a disk write
   If me.Dirty = false then
      Me.Dirty = true
   End if
End if

您可能想要扩展并提供更多详细信息,说明哪些表达式不起作用。但是,上面最显着的差异在于主键在什么时间点被创建并可供表单上的其他表达式使用。

【讨论】:

以上是关于SQL Server 延迟问题的主要内容,如果未能解决你的问题,请参考以下文章

奇怪的 SQL Server 延迟加载表变量?

[SQL Server]内存缓存数据写入磁盘延迟持久性Delayed Durability(和魔鬼交易)

[SQL Server]内存缓存数据写入磁盘延迟持久性Delayed Durability(和魔鬼交易)

Performance Monitor4:监控SQL Server的IO性能

Performance Monitor4:监控SQL Server的IO性能

sql server 高可用日志传送