ADOQuery,触发器和重新查询错误

时间:2009-06-23 10:11:22

标签: sql-server delphi ado triggers

我有一个ADOQuery,它将记录插入到SQL Server 2005表中,该表具有将数据插入另一个表的触发器。我使用以下代码刷新查询并避免Row cannot be located for updating(每个表上都有PK,设置了UpdateCriteria属性,Cursors设置为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错误,但我不认为这会影响我的问题。当我使用Delphi 6 - 7和SQL Server 2000时,我没有看到这样的错误,因此我愿意尝试SDACDAO。 SDAC或DAO会解决问题,还是在没有更改ADOQuery的情况下有任何解决方案?

2 个答案:

答案 0 :(得分:2)

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

编辑

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

答案 1 :(得分:1)

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