2015-06-18 3 views
0

Я хотел бы использовать SqlDependency класс в моем приложении WinForms:Получение уведомления от Sql Server

public partial class Form1 : Form 
    { 
     private int changeCount = 0; 
     private const string statusMessage = "{0} changes have occurred."; 

     private static SqlConnection connection = null; 
     private static SqlCommand command = null; 
     private static SqlDependency dependency; 

     private static SqlCommand command1 = null; 
     private static SqlDependency dependency1; 

     public Form1() 
     { 
      InitializeComponent(); 
      button1.Enabled = CanRequestNotifications(); 
      this.FormClosed += Form1_FormClosed; 
      if (connection == null) 
      { 
       connection = new SqlConnection(GetConnectionString()); 
      } 

      if (command == null) 
      { 
       command = new SqlCommand("procCreationUser", connection); 
       command.CommandType = CommandType.StoredProcedure; 
      } 
      dependency = new SqlDependency(command); 

      if (connection == null) 
      { 
       connection = new SqlConnection(GetConnectionString()); 
      } 

      if (command1 == null) 
      { 
       command1 = new SqlCommand("procSelectionUser", connection); 
       command1.CommandType = CommandType.StoredProcedure; 
      } 
      dependency1 = new SqlDependency(command1); 
      GetData(); 
     } 

     private void GetData() 
     { 

      SqlDependency.Start(GetConnectionString()); 
      if (connection.State != ConnectionState.Open) connection.Open(); 
      using (var dr = command.ExecuteReader()) 
      { 
       dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); 
      } 

      using (var dr = command1.ExecuteReader()) 
      { 
       dependency1.OnChange += new OnChangeEventHandler(dependency_OnChange); 
      } 

     } 
     private string GetConnectionString() 
     { 
      return @"Data Source=PRT-12\SQLEXPRESS; Initial Catalog=TestNotification;Integrated Security=True"; 
     } 


     private void dependency_OnChange(object sender, SqlNotificationEventArgs e) 
     { 
      MessageBox.Show("Notification");  
     } 

    } 

Я создал две хранимые процедуры: procCreationUser для создания и procSelectionUser для выбора пользователей.

Когда я запустил приложение, и я нажал на кнопку и вставил новую строку в базу данных, у меня нет уведомления !!!!!

  1. Как я могу исправить свой код?
  2. Это лучший способ получить уведомление от Sql Server?
+0

Вам нужно убрать свой код, это немного повсюду. – artm

+0

@artm см. Мое редактирование –

+0

Включили ли вы Сервисный Брокер в своей базе данных. –

ответ

1

Я рекомендую вам прочитать эти:

Вы должны установить что происходит следующее событие:

  • Ваш запрос создает подписку на уведомление. Проверьте Profiler событие, упомянутое в вышеуказанных статьях, проверьте в sys.dm_qn_subscriptions
  • проверки, что изменение данных аннулирует подписку, используйте Profiler событие, упомянутое в вышеуказанных статьях
  • убедиться, что сообщение уведомлений доставляются, специально проверить transmission_status в sys.transmission_queue
  • убедитесь, что ваш код успешно настроил прослушиватель уведомлений. Ваше приложение должно позвонить SqlDependency.Start один раз за приложение, и в идеале следует позвонить SqlDependency.Stop, когда appdomain выключится.

После того, как вы получите уведомление, протекающий убедитесь, что вы проверить и чтить Source, Info и Type в вашем SqlNotificationEventArgs арг. Не все комбинации указывают на успех, уведомление также может сразу срабатывать, указывая на проблему с вашей подпиской.

Кроме того, небольшие лакомые кусочки с вашим кодом:

  • вам нужно подключить к SqlDependency перед тем выполнения запроса:

    зависимость.OnChange + = новый OnChangeEventHandler (dependency_OnChange); используя (вар др = command.ExecuteReader()) { в то время как (dr.Read()) { ... }}

  • вам нужно позвонить SqlDependency.Startраз в AppDomain. Попробуйте позвонить в Main, прежде чем отображать форму

0

Обычно вы должны подписаться на события первого dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); и только после этого вы будете получать обновления от command.ExecuteReader().
Для двух отдельных команд, вероятно, лучше иметь два отдельных SqlDependency.

+0

см. Мое редактирование, даже я меняю свой код так, я не получаю уведомления –

+1

Вы по-прежнему подписываетесь слишком поздно. 'dependency1.OnChange + = new OnChangeEventHandler (dependency_OnChange);' должен находиться в 'Form1()' методе. – dmigo

+0

Выполняется в методе Getdata, вызываемом в конструкторе !! –