sql-server - SQL Server 在链接的 MS Access 表上插入后返回不同的记录

标签 sql-server sql-server-2008 ms-access

我们最近将后端数据库从 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.

more

关于sql-server - SQL Server 在链接的 MS Access 表上插入后返回不同的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5956689/

相关文章:

c# - 如何从整数列表中计算排名?

sql-server - 使用 cfqueryparam 在包含哈希的索引列上搜索的慢速查询

sql - 基于不同表列的计算列公式

SQL Server 4字节无符号整数

c# - 如何使用 C# 检索给定日期(无论时间)的记录?

excel - 如何删除 Access 或 Excel 中的重复条目和原始条目(多列)

excel - 从 CSV 复制到 Access 时避免数字被截断

sql-server - 使用连接中的数据更新相关表中的列

sql - 合并来自同一数据集的不同时期的总和

在 SQL Server 2008 上创建表的 SQL 注释