2011-05-16 6 views
1

OracleDependency는 쿼리 만 모니터링 할 수 있다는 것을 알고 있습니다. 나는 2 개의 명령 객체와 2 개의 의존 객체를 만들었지 만 둘 다에 대한 질의는 where 절이 다르므로이 테이블의 두 개의 다른 부분 집합을 조사해야한다.C# OracleDependency OnChange 여러 번 실행합니다.

같은 콜백에 이러한 종속성 개체를 모두 할당합니다. 내 기대는 테이블에서 뭔가를 변경하면 OnChange 이벤트가 해당 종속 개체에서 발생한다는 것입니다. 그때 TEH 변화를 트리거 쿼리를 얻을 수있는 OnChange 이벤트에 다음을 수행 할 수있을 것입니다 :

OracleDependency OraDep = (OracleDependency)sender; string sql = (string)OraDep.RegisteredResources[0];

그래서 설치 다른 where 절 값이 동일한 테이블에 대해 2 개 쿼리. 그런 다음 DB로 가서 그 중 하나를 변경하지만 놀랍게도 OnChange는 두 번 발생합니다. 위의 코드는 쿼리를 통해 두 쿼리를 모두 보여줍니다.

전체 테이블이 아닌 특정 쿼리에 대한 의존성을 가질 방법이 없습니까? 나는 당신이 특정 쿼리를 위해 어딘가에 그것을 읽었을 것이라고 생각했다.

답변

2

Oracle 변경 알림은 조회가 아닌 오브젝트를 모니터합니다. 새 레코드가 삽입, 업데이트 또는 삭제 된 테이블의 모든 변경 사항, 새 열 추가, 이름 변경/삭제. Thats 이유는 2 번 알림을 보는 이유입니다.

한 가지 방법은 쿼리 대신 저장 프로 시저를 호출하는 것입니다. 알림 1 건만 수락하십시오. 알림 이벤트 e.info는 삽입/업데이트/삭제 중 어떤 작업인지 알려줍니다. 따라서 if 조건을 작성하여 삽입 통지에만 응답하고 이에 기반하여 적절한 sp 또는 쿼리를 호출 할 수 있습니다.

희망이 도움이됩니다.

+0

나는 그 때 문제가다는 것을 나는 생각한다. 이 변화 사건에서 저는 무엇이 바뀌 었는지 알아야합니다. 이 정보를 보여주기 위해 내가 볼 수있는 것 같지 않습니다. 내가 통과 한 cmd에 where 절이있는 예제를 보았지만 이상하게 보일 수는 있지만, 여전히 C# 응용 프로그램에서 무엇이 변경되었는지 알 필요가 있습니다. – user441521

+0

"무엇이 바뀌 었는가"라는 것이 무엇인지 명확히하자. 나는 변경된 레코드 (msg 유형이 업데이트 일 때)가 아니라 테이블이 변경된 것을 의미합니다 (cmd를 설정 한 이후로 알 수 있듯이). – user441521

+0

@ user441521 업데이트에만 관심이 있으므로 이벤트 처리기에서 if if (e.info.ToString() == "Update") if 조건을 가질 수 있습니다. {Process} else ignore. –