访问链接到SQL:为新创建的记录显示错误的数据,自动编号主键



这与另一个问题类似,我给它起了相同的名字。但我的情况有点不同。

第一个可供参考的问题:访问链接到SQL:为新创建的记录显示错误的数据

我有一个Access前端链接到SQL Server中的表。对于所有相关的表,都有一个autonumber(int with Identity Specification(作为主键。大约一半的链接表有以下问题,其他的则没有,尽管设置类似:

向表中添加新记录时,会将该记录插入SQL数据库,但在访问前端视图中,无论是表还是表单,添加的记录都会填充另一条记录的数据。

在另一个问题中,解释了Access正在使用@@IDENTITY查询SQL Server。我在痕迹中看到了同样的东西。在我的例子中,它尝试了两次SELECT@@IDENTITY,然后尝试用sp_prepexec生成的SQL来拉取我无法读取的新记录,但在某些表中总是得到错误的记录,而在其他表中则没有,这些表的设置基本相同。

返回的错误记录似乎是表中较早的一个自动编号,如果我连续多次这样做,它会按顺序返回一系列自动编号,例如18347、18348、18349。(这些是显示的不正确的自动编号,以及它们记录中的所有数据,而不是新创建的记录。(但如果我等几分钟,就会有一个间隙,例如,下一个可能会返回18456。

刷新确实可以看到正确的记录。

自动编号字段在Access设计视图中显示为主键。Access前端是一个.mdb文件。我们正在使用Access for Microsoft 365 MSO 64位。

一般来说,这个问题不应该出现。

然而,有两种情况需要牢记。第一种情况:Access当您开始使用Access后端(BE(键入记录时,会生成自动编号并立即显示,甚至在记录保存之前也会发生这种情况。

事实上,如果记录没有保存(用户点击Esc键,或者从菜单中取消操作,甚至ctrl-z(。此时,记录没有变脏,也不会被保存。当然,这意味着间隙将并且可能出现在自动编号中。

当使用链接表到sql server时?您可以开始键入,记录会变脏,但AUTONUMBER不会显示,并且尚未生成。因此,您的代码还不能完全使用autonumber。必须先保存记录,然后才能获取/获取/使用自动编号。

现在是表格+子表格吗?好吧,它们之所以有效,是因为当焦点转移到子窗体时,访问(对于sql或访问表(总是对主窗体进行记录保存。所以这些设置应该继续有效。

我注意到并提到了上面的内容,因为在记录添加过程中使用或需要使用自动编号的某些代码可能存在于您的应用程序中。必须更改该代码。现在公平地说,即使在一个相当大的应用程序中,我也很少发现这种情况发生的地方。

通常,简单的解决方案是修改代码,然后强制写入记录,然后使用autonumber。你可以这样做:

if me.IsNewReocrd = True then
if me.dirty = true then me.Dirty = false
end if
' code here that needs the PK autonumber
lngNewID = me!id   ' the autonumber is now generated and available for use.

下一个常见问题(可能也是您的问题(。

有问题的表具有触发器。您必须修改存储过程以重新选择PK id,如果不修改,则会看到/找到您看到的症状。如果存储过程更新了其他表,那么它可以工作,但存储过程的最后一行需要重新选择PK id。

那么,在附加到表的存储过程的最后一行中?您需要重新选择现有PK值。例如:

SELECT @MyPK as ID

最新更新