【问题标题】:Record Has Been Changed By Another User when try to Post or Edit尝试发布或编辑时记录已被其他用户更改
【发布时间】:2012-01-30 12:43:19
【问题描述】:

我正在使用 Delphi 7Sql Server express 2008 R2 开发应用程序,我正在使用 BDE 通过 ODBC 连接 Sql Server,以及 SQL Native Client 用于驱动程序。

在某些特定形式中,表格组件引发EDBEngineError 'Record has been changed by another user' ,我只是尝试追加数据,table.canceltable.posttable.edit 时会出现同样的问题。 ...

在我将驱动程序从 SQL Server 更改为 Sql Native Client 前几天,因为 sql server 出现“连接有另一个 hstmt 的结果集”的问题,所以我将其更改为 SQL Native 客户端,由此我遇到了“记录已被另一个用户更改”错误。

请任何人帮忙

【问题讨论】:

  • 你需要想办法查看生成的SQL才能找到根本原因,我建议用“Use Debug DCUs”编译并进入BDE源代码,直到可以看到生成的SQL细绳。我最近用 dbExpress 解决了一个类似的问题。

标签: sql-server delphi odbc bde sql-server-native-client


【解决方案1】:
  1. BDE 长时间未更新。并且 SQL Native Client 会定期更新。您可能会遇到 BDE 和 SQLNC v 10.5 不兼容的问题。
  2. “记录已被其他用户更改”表示该 API 返回 1 条已更新记录,例如 0 条记录。在大多数情况下,某些用户更改了记录并不是真的。更新记录的数量作为单独的消息返回,因此如果连接正忙于处理其他消息,则可能返回 0。如果您的表有触发器,请尝试在触发器顶部添加 SET NOCOUNT ON。李>
  3. “连接正忙于处理另一个 hstmt 的结果集”表示您尚未从活动结果集中获取所有记录。您可以尝试获取所有记录。
  4. 为避免所有这些错误,请考虑迁移到 dbExpress 或 AnyDAC 等 3d 方库。

对 (2) 的补充: “记录已被其他用户更改”的其他经典原因。 WHERE 短语包括一个字段和一个对应的参数,不匹配精度(例如,精度在客户端丢失),具有不同的格式(例如,不兼容的字符集)等。您必须检查SQL命令和使用 SQL Profiler 发送到 SQL Server 的参数值。

【讨论】:

  • dbExpress 仍然存在可能导致相同错误的问题 - 例如缺乏对毫秒的支持(使用 InterBase)
  • 谢谢你的回复,在此之前我想说一件事,
  • 感谢您的回复,首先我使用“Paradox” db开发了这个应用程序,然后迁移到sql server,我在datamodule中有100个表组件,所以不容易更改全部到另一个第 3 部分 comp,创建 OBDC 数据源并通过 BDE 连接它,并且这个“被另一个用户错误锁定的记录只会发生在临时表中(表名以“#”开头),我也尝试使用 sqlserver 驱动程序,我无法找到哪个查询是部分获取的数据,所以我转换为 sqlnative 客户端,在我更改了“hstmt 错误消失”但记录锁定错误出现之后,
  • @da-soft 提供的不错的列表。我们遇到了同样的问题。在我们的案例中,我们发现特定表上的一个触发器正在执行“打印”语句。我们将其注释掉并解决了错误。
【解决方案2】:

朋友,您应该考虑更新您的开发工具。 对于这个问题,您应该真正使用 ZEOS Component Pack for Delphi。 它可以连接多种数据库,包括Firebird、MySQL、Access和SQL Server。 您所要做的就是将您正在使用的数据库的dll放在您的项目目录和delphi的bin目录中(如果目标计算机没有数据库管理器)。 然后让数据库服务器处理事务。 如果您需要更多详细信息,请给我一个信号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多