我们最近将后端数据库从 SQL Server 2000 升级到 SQL Server 2008。自从切换以来,我们遇到了间歇性(读作:不可能持续重现)和奇怪的问题,但它们似乎都以某种方式相关。
在一种情况下,我们的用户通过绑定(bind)表单向表中添加一条新记录。 一旦记录被保存,一个不同的(更旧的)记录就会显示在它的位置。按 Shift+F9 强制重新查询窗体的返回新添加的记录(窗体被过滤以仅显示一条记录)。
我们已设法根据以不同形式发生的日志记录来隔离问题的特定实例。在窗体的 BeforeUpdate 事件中,时间戳已正确填写在要插入的记录上。在同一窗体的更新后事件中,在另一个表中创建了一条历史记录,其中包括第一个表的自动编号 ID。 这些历史记录中大约有十分之一是使用错误的自动编号 ID 创建的。
有没有人目睹过这种行为或对此有任何解释?
编辑:其他想法:
- 后端数据库是合并复制的一部分
- Access前端版本为2000和2002(其他版本未测试)
- 我读过的一篇文章建议 Access 在幕后使用
@@IDENTITY
从 SQL Server 获取新添加的记录 - 使用
{SQL Server}
ODBC 驱动程序和{SQL Server Native Client 10.0}
ODBC 驱动程序连接到后端表时出现问题 - 兼容级别设置为 80(SQL Server 2000 级别兼容)
编辑: SQL 事件探查器跟踪结果:
我运行了 SQL Profiler 并确认 Access 确实在幕后使用 SELECT @@IDENTITY
来返回新插入的记录。我确认这发生在 MS Access 2000、2002 (XP) 和 2007 前端。无论是使用 {SQL Server}
ODBC 驱动程序还是 {SQL Server Native Client 10.0}
ODBC 驱动程序链接表,都会发生这种情况。
我应该强调 Access 正在使用 SELECT @@IDENTITY
在幕后。据我所知,没有办法强制 Access 使用 SCOPE_IDENTITY
。不过太糟糕了,因为这似乎是最简单的解决方法。
最佳答案
使用 SCOPE_IDENTITY 而不是 @@IDENTITY。
Since @@IDENTITY returns the last identity values generated in current session, if there are some triggers in any tables manipulated in current session, we will get unexpected value. In order to get the required value, please use SCOPE_IDENTITY. This function will return value inserted only within the current scope.
关于sql-server - SQL Server 在链接的 MS Access 表上插入后返回不同的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5956689/