代码之家  ›  专栏  ›  技术社区  ›  curious slab

AdoQuery、Trigger和Requery错误

  •  1
  • curious slab  · 技术社区  · 17 年前

    我有一个ADOquery,它向SQL Server 2005表中插入一条记录,该记录触发向另一个表中插入数据。我使用以下代码刷新查询并避免 Row cannot be located for updating (每个表上都有pk,设置了updateCiriteria属性,将光标设置为dynamic,但有时仍然会出错。但现在不是问题)。

    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 错误,但是我认为这不会影响我的问题。在使用Delphi6-7和SQL Server 2000时,我没有看到这样的错误,因此我愿意 SDAC DAO 尝试一下。sdac或dao是否可以解决问题,或者在不更改adoquery的情况下是否有任何解决方案?

    2 回复  |  直到 17 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

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

    编辑

    该问题似乎与以下事实有关:ADO查询本身正在使用@@Identity获取添加的记录的ID,而实际上它应该使用scope_Identity(),这在触发器将数据插入另一个包含标识列的表(与您的情况相同)时会产生影响-有关scope_ID的详细信息,请参阅上面的链接实体和@@Identity。 This post 有问题的一些细节

        2
  •  1
  •   skamradt    17 年前

    解决这个混乱的方法之一就是在保存(如果guid是空的)之前向主表中添加一个guid字段,然后在代码中生成一个新的guid,并保留该引用。然后我保存记录并重新查询包含已知guid的记录。这给了我保险,我得到了我想要的准确记录,然后将继续分配FK到主记录的身份值。当然,这是缓慢的,但它总是统计工作。