【问题标题】:ADOQuery, trigger and requery bugADOQuery,触发和重新查询错误
【发布时间】:2009-06-23 10:11:21
【问题描述】:

我有一个 ADOQuery,它向 SQL Server 2005 表插入一条记录,该表具有向另一个表插入数据的触发器。我使用以下代码刷新查询并避免Row cannot be located for updating(每个表上都有PK,设置了UpdateCriteria属性,游标设置为动态,但有时我仍然会收到错误。但现在不是问题了)。

procedure Requery(T: TCustomADODataSet; IDField: string);
var
  i: integer;
begin
  if T.RecordCount > 0 then
    i := T.FieldByName(IDField).AsInteger;
  T.Requery();
  if T.RecordCount > 0 then
    T.Locate(IDField, i, []);
end;

在重新查询之前,我可以获得 ID 字段的值。但是,重新查询后,ID 字段返回触发器插入的其他表记录的 ID 字段的值。两个表都有同名的 ID 字段。我还添加了SET NOCOUNT ON .... OFF 来触发以避免Too Many Rows Affected 错误,但是我认为这不会影响我的问题。在使用 Delphi 6 - 7 和 SQL Server 2000 时,我还没有看到类似的错误,因此我愿意尝试SDACDAO。 SDAC 或 DAO 会解决问题吗?或者是否有任何解决方案而不更改 ADOQuery?

【问题讨论】:

  • 用什么来获取ID字段的值?
  • ADOQueryName.FieldByName('ID').AsInteger;

标签: sql-server delphi ado triggers


【解决方案1】:

我不熟悉 ADOQuery,但正如您所说,您正在获取受触发器影响的表的 ID,同时期望获取原始表的 ID,这可能是使用与 SQL“scope_identity”等效的函数的问题。 Best way to get identity of inserted row?

编辑

问题似乎与 ADO 查询本身使用 @@Identity 来获取添加记录的 ID 而它应该真正使用 scope_identity() 的事实有关,这在您有触发器插入数据时会产生影响另一个包含身份列的表,就像您的情况一样 - 有关 scope_identity 和 @@identity 的详细信息,请参见上面的链接。 This post有一些问题的细节

【讨论】:

  • 我不使用@@IDENTITY 或SQL 来获取ID 字段的值。即使我使用datagrid显示表格内容,新添加的记录的ID字段也会显示触发器插入的记录的ID值。不过所有其他字段都很好。
  • 这里有一篇文章表明 ADOQuery 在幕后使用 @@Identity 而不是 scope_identity 并且它可能是问题的根源groups.google.com/group/comp.lang.pascal.delphi.databases/…
  • 如 PDF 中所述,非常丑陋的 hack,但它对我有用。谢谢:-)
【解决方案2】:

我过去使用的解决这种混乱的一种方法是在我的主表中添加一个 GUID 字段,然后保存(如果 guid 为空)我将在代码中生成一个新的 guid,并保留该引用.然后我会保存记录并重新查询包含已知 guid 的记录。这确保我得到了我想要的确切记录,然后将继续将 FK 分配给主记录的标识值。当然这会慢一些,但它在统计上总是有效的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    相关资源
    最近更新 更多