2017-11-16 13 views
0

처음 SQL 종속성을 사용하여 작업했지만 몇 가지 예제를 거친 후 필자는 모든 것이 정확하다고 느낍니다. Broker가 Enabled인지 확인했습니다. 나는 나의 질문이 정확하다는 것을 더 확인했다. 나는 어떤 예외도받지 못하고있다! 모두가 모든 것이 작동해야하는 것처럼 보입니다. 그러나 그렇지 않습니다. 예외가 발생하지 않고 문제를 해결하는 방법을 알지 못합니다.SQL 종속성 이벤트가 트리거되지 않음

매우 도움이 될만한 도움이 될 것입니다!

public class NotificationEvent 
{ 
    private delegate void RateChangeNotification(DataTable table); 
    private SqlDependency dependency; 
    string ConnectionString = @"ConnectionString"; 
    string UserName = Environment.UserName; 

    public async void StartNotification() 
    { 
     SqlDependency.Start(this.ConnectionString, "UserNotificationsQueue"); 
     SqlConnection connection = new SqlConnection(this.ConnectionString); 
     await connection.OpenAsync(); 

     SqlCommand command = new SqlCommand();   
     command.Connection = connection; 
     command.CommandType = CommandType.Text; 
     command.CommandText = string.Format("SELECT [NotificationID],[UserFrom],[UserTo],[DateTimeSent],[Notification] FROM [dbo].[PersonnellNotifications]", UserName); 
     command.Notification = null; 


     this.dependency = new SqlDependency(command, "Service=PostUserNotificationsQueue;", Int32.MaxValue); 
     dependency.OnChange += new OnChangeEventHandler(this.SqlDependencyOnChange); 
     await command.ExecuteReaderAsync(); 
    } 

    private void SqlDependencyOnChange(object sender, SqlNotificationEventArgs eventArgs) 
    { 
     if (eventArgs.Info == SqlNotificationInfo.Invalid) 
     { 
      Console.WriteLine("The above notification query is not valid."); 
     } 
     else 
     { 
      Console.WriteLine("Notification Info: " + eventArgs.Info); 
      Console.WriteLine("Notification source: " + eventArgs.Source); 
      Console.WriteLine("Notification type: " + eventArgs.Type); 
     } 
    } 


    public void StopNotification() 
    { 
     SqlDependency.Stop(this.ConnectionString, "QueueName"); 
    } 
} 

내가 본 같은 다른 클래스 IniatializeComponent()에서이 초기화하고 : 난 그냥 내 코드와 그 작업 좋은에서 다음 테스트 한

private void InitializeComponent() 
{ 
    // Initialize SQL Dependancy   
    ne.StartNotification(); 
} 
+0

내 친숙 함이 다소 제한,하지만 난 당신이 당신이 실제로 서버에서 무슨 일을하는지보고 SQL 프로파일 러를 연결 한 경우 궁금 해서요 : 참조하십시오. – Amy

+0

의도적으로이 초기화는 Global.asax.Application_Start 또는 Startup.cs가 발생해야합니다. – Programmer

+0

@Programmer 당신은 맞습니다 ... 나는 실제로 몇 분 전에 또 다른 문제를 따라 전환했습니다. 그러나 시작 단계에서도 동일한 결과가 나타났습니다. –

답변

1

여기 내 클래스입니다. 나는 코드를 단순화했다. 이 방법이 작동하는지 확인하고 Db 변경시 OnNotificationChange를 호출하십시오.

public async void RegisterForNotification() 
{ 
    var connectionString = @"ConnectionString"; 
    using (var connection = new SqlConnection(connectionString)) 
    { 
     await connection.OpenAsync(); 

      var queryString = "Your Query String"; 
      using (var oCommand = new SqlCommand(queryString, connection)) 
      { 
       // Starting the listener infrastructure... 
       SqlDependency.Start(connectionString); 

       var oDependency = new SqlDependency(oCommand); 
       oDependency.OnChange += OnNotificationChange; 

       // NOTE: You have to execute the command, or the notification will never fire. 
       await oCommand.ExecuteReaderAsync(); 
      } 
     } 
    } 


private void OnNotificationChange(object sender, SqlNotificationEventArgs e) 
{ 
    Console.WriteLine("Notification Info: " + e.Info); 
    //Re-register the SqlDependency. 
    RegisterForNotification(); 
} 
+0

OP의 코드가 아니라면 왜 코드가 작동한다고 생각하는지 설명하면 더 나은 대답이 될 것입니다. –

+0

달콤한! 나는 이것을 몇 시간 동안 돌렸다. 어떤 생각을 내가 뭘 잘못하고 있었습니까 ?? –

+0

또한 이벤트가 시작된 후에 다시 등록해야한다는 것을 알지 못했습니까? 그게 필요한가요? –

1

SQLClientPermission을 설정하고 있습니까? SQL 종속성 https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/enabling-query-notifications

// Code requires directives to 
// System.Security.Permissions and 
// System.Data.SqlClient 

private bool CanRequestNotifications() 
{ 
    SqlClientPermission permission = 
     new SqlClientPermission(
     PermissionState.Unrestricted); 
    try 
    { 
     permission.Demand(); 
     return true; 
    } 
    catch (System.Exception) 
    { 
     return false; 
    } 
} 
+0

당신은 정확합니다 ... 나는 이것을 놓치고있었습니다. 불행히도 그러나 그것은 내 문제를 해결하지 못했습니다. –