2009-06-23 3 views
1

다른 테이블에 데이터를 삽입하는 트리거가있는 SQL Server 2005 테이블에 레코드를 삽입하는 ADOQuery가 있습니다. 다음 코드를 사용하여 쿼리를 새로 고치고 Row cannot be located for updating을 피하십시오 (각 테이블에 PK가 있고 UpdateCriteria 속성이 설정되어 있고 커서가 동적으로 설정되어 있지만 때때로 오류가 발생합니다.) 그러나 지금은 질문이 아닙니다.ADOQuery, trigger 및 requery bug

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 필드는 트리거에 의해 insterted 다른 테이블 레코드의 ID 필드 값을 반환합니다. 두 테이블 모두 같은 이름의 ID 필드가 있습니다. 또한 Too Many Rows Affected 오류를 피하기 위해 SET NOCOUNT ON .... OFF을 추가했지만, 내 문제에 영향을 미치지는 않습니다. Delphi 6 - 7 및 SQL Server 2000에서 작업 할 때 이런 오류를 보지 못했습니다. 따라서 SDAC 또는 DAO을 시도해 볼 수 있습니다. SDAC 또는 DAO가 문제를 해결하거나 ADOQuery를 변경하지 않고도 해결책이 있습니까?

+0

ID 필드 값을 얻기 위해 무엇을 사용합니까? – kristof

+0

ADOQueryName.FieldByName ('ID'). AsInteger; –

답변

2

ADOQuery에 익숙하지 않지만 원래 테이블의 ID를 얻으려고하는 동안 트리거에 의해 영향을받은 테이블의 ID를 얻고 있다고 말하면서 아마도 SQL "scope_identity"에 해당하는 기능을 사용하는 문제입니다. 참조 Best way to get identity of inserted row?

편집 문제가 ADO 쿼리 자체가 정말이 SCOPE_IDENTITY을 사용해야 동안) (추가 된 레코드의 ID를 얻기 위해 @@ IDENTITY를 useing된다는 사실과 관련이 보인다

, ID 열이있는 다른 테이블에 데이터를 삽입하는 트리거가있을 때 그 의미가 있습니다. case - scope_identity 및 @@ identity에 대한 자세한 내용은 위 링크를 참조하십시오. This post에는 문제에 대한 세부 정보가 있습니다.

+0

ID 필드의 값을 가져 오기 위해 @@ IDENTITY 또는 SQL을 사용하지 않습니다. 테이블 내용을 표시하기 위해 DataGrid를 사용하더라도 새로 추가 된 레코드의 ID 필드는 트리거에 의해 삽입 된 레코드의 ID 값을 표시합니다. 하지만 다른 모든 필드는 괜찮습니다. –

+0

여기에 ADOQuery가 scope_identity 대신 @@ Identity를 사용하고 문제의 출처가 될 수 있다고 제안하는 게시물이 있습니다. http://groups.google.com/group/comp.lang.pascal.delphi.databases/browse_thread/thread/608c416d478c58d2? pli = 1 – kristof

+0

여기 http://coding.derkeiler.com/pdf/Archive/Delphi/borland.public.delphi.database.ado/2004-05/0109.pdf – kristof

1

과거에 사용했던이 엉망을 해결하는 한 가지 방법은 저장하기 전에 GUID 필드를 저장하기 전에 (GUID가 비어있는 경우) 새 GUID를 생성하는 것이 었습니다 코드에 저장하고 해당 참조를 고정시킵니다. 그런 다음 레코드를 저장하고 알려진 GUID가 포함 된 레코드를 다시 쿼리합니다. 이것은 필자가 원했던 정확한 기록을 얻었고, FK를 마스터 레코드의 아이덴티티 값에 할당하도록 진행할 것입니다. 물론 이것은 느리지 만 항상 통계적으로 효과가 있습니다.