2009-12-15 2 views
4

winforms 응용 프로그램 내 데이터베이스에서 삽입 이벤트를 캡처하기 위해 SQL Server 알림을 사용하고 싶습니다. SQLDependency 개체를 사용하려고합니다. MSDN 기사를 보면이 사실이 꽤 솔직하게 보입니다. 그래서 그것을 시험해보기 위해 약간의 예제 애플리케이션을 만들었습니다. 처음으로 응용 프로그램을 시작할 때만 이벤트가 발생하는 것 같습니다 (MessageBox가 나타납니다). 테이블에 데이터를 삽입해도 OnChange 이벤트가 발생하지는 않습니다. 누군가 내가 놓친 걸 말해 줄 수 있니? 감사!SQL Server 알림 - 내 OnChange가 실행되지 않습니다.

public Main() 
    { 
     InitializeComponent(); 
     var check = EnoughPermission(); 
     SqlDependency.Stop(constr); 
     SqlDependency.Start(constr); 
     if(connection == null) 
     { 
      connection = new SqlConnection(constr); 
     } 
     if(command == null) 
     { 
      command = new SqlCommand("Select ID, ChatMessage FROM dbo.Chat",connection); 
     } 
     connection.Open(); 
     command.Notification = null; 
     SqlDependency dependency = new SqlDependency(command); 
     dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); 
     command.ExecuteReader(); 
    } 





    private void dependency_OnChange(object sender, SqlNotificationEventArgs e) 
    { 
     MessageBox.Show("Change!"); 
    } 
+0

어디에서 데이터를 삽입하고 있습니까? SELECT 문은 INSERT가 아닙니다. –

+0

쿼리 분석기에 데이터를 삽입하고 있습니다. INSERT에 대한 좋은 호출이 SELECT가 아니므로 :) Select는 데이터베이스에서보고자하는 데이터를 나타 내기 위해 필요합니다. – Nick

+0

SqlDendency 개체에 SELECT를 건네주는 것에 주목하십시오. – Nick

답변

6

첫 번째 알림은 귀하에게 유일한 알림입니다. 쿼리 알림은 변경 사항에 대한 구독이 아니며 알림이 시작되면 무효화됩니다. 새 알림 구독을 다시 제출해야합니다.

쿼리가 immedeatly로 통보되면 변경 사항에 대한 알림을받지 못했음을 의미합니다. 잘못된 쿼리에 대한 알림입니다. 받은 SqlNotificationEventArgs 인수의 값을 확인하십시오. Info이 삽입/업데이트/삭제인지 확인하고 Source이 데이터인지 확인하고 Type이 변경되었는지 확인하십시오.

알림을 받았을 때 어떻게 다시 구독해야하는지 잘 이해하려면 Watcher Application 예제를 살펴보십시오. Query Notifications의 작동 방식을 더 잘 이해하려면 The Mysterious Notification을 참조하십시오.

+0

그래서 선택이 유효하지 않습니까? info 속성에 'invalid'가 있습니다. 감사합니다 아픈 당신이 보낸 이러한 링크를 한번보세요! – Nick

+0

SELECt는 본인에게 적합하지만 보이지 않는 기준이 있습니다. http://msdn.microsoft.com/en-us/library/ms181122(SQL.90).aspx –

11

쿼리 알림을 구현하는 동안 정확한 문제가 발생했습니다. 모든 구성, 코드 조각 및 TCP 설정을 검사했지만 아무런 도움이되지 않았습니다. 그런 다음 데이터베이스에서 실행되는 다음 쿼리를 파악하고 문제를 해결했습니다. 어쩌면 당신은 그것을 시도 할 수 있습니다.

ALTER AUTHORIZATION ON DATABASE::[Your DB] TO sa; 
+0

을 참조하십시오. 대단히 감사합니다. 선생님,이게 내 문제를 해결했습니다. –

+3

저 또한 나를 위해 일했습니다. 그러나이 쿼리로 수행 된 작업을 이해하고 싶습니다. – bussa

+0

'제안 된 새 데이터베이스 소유자는 이미 사용자이거나 데이터베이스의 별명입니다 .' –

관련 문제