2009-11-19 4 views
1

У меня есть консольное приложение, в котором я выполняю sqldependency. Моя проблема в том, что я устанавливаю commandType как Text, он работает нормально. Но если я использую commandType как StoredProcedure, метод onchange вызывает бесконечно.Windows Application SqlDepedency Calling Onchange бесконечно

Пожалуйста, смотрите код ниже:



     static DataSet myDataSet; 
     static SqlConnection connection; 
     static SqlCommand command; 

     static void Main(string[] args) 
     { 

      // Remove any existing dependency connection, then create a new one. 
      string connstr = "Data Source=XYZ;Initial Catalog=Dev;Integrated Security=True"; 
      string ssql = @"[dbo].[SchedulerPendingControlRequestIDFetch]"; 

      CanRequestNotifications(); 


      SqlDependency.Stop(connstr); 
      SqlDependency.Start(connstr); 


      if (connection == null) 
       connection = new SqlConnection(connstr); 
      if (command == null) 
       command = new SqlCommand(ssql, connection); 
      command.CommandType = CommandType.StoredProcedure; 

      if (myDataSet == null) 
       myDataSet = new DataSet(); 
      GetAdvtData(); 

      System.Console.ReadKey(); 
      connection.Close(); 
     } 

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



     private static void GetAdvtData() 
     { 
      myDataSet.Clear(); 
      // Ensure the command object does not have a notification object. 
      command.Notification = null; 
      // Create and bind the SqlDependency object to the command object. 
      SqlDependency dependency = new SqlDependency(command,null,100); 

      dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); 

      using (SqlDataAdapter adapter = new SqlDataAdapter(command)) 
      { 
       adapter.Fill(myDataSet, "ControlRequest"); 

      } 
     } 

     private static void dependency_OnChange(object sender, SqlNotificationEventArgs e) 
     { 
      SqlDependency dependency = 
     (SqlDependency)sender; 

      dependency.OnChange -= dependency_OnChange; 

      Console.WriteLine(e.Info.ToString() + e.Source.ToString()); 
      GetAdvtData(); 
     } 

Моя хранимая процедура:



IF OBJECT_ID('SchedulerSirasColcoDetailFetch') IS NOT NULL 
DROP PROCEDURE SchedulerSirasColcoDetailFetch 
Go 
PRINT 'Creating stored procedure SchedulerSirasColcoDetailFetch' 
Go 

CREATE PROCEDURE [dbo].[SchedulerSirasColcoDetailFetch] 
AS 
BEGIN 


SELECT Colco_Code AS 'CountryCode',Connection_String AS 'Url',Resend_Interval AS 'ResendInterval', 
    Default_Encoding AS 'Encoding' FROM dbo.SirasColcoDetail 
END 

Если я копирую отборное заявление внутри хранимой процедуры, как мой командный текст и установить CommandType как текст, все работает нормально.

не могли бы вы сообщить мне, в чем проблема?

Большое спасибо.

Махеш

ответ

1

Вы должны проверить значения аргумента SqlNotificationEventArgs. Только если Type является Change и Source является Data где вы получили уведомление о замене данных.

Вы обнаружите, что вас не уведомили об изменениях данных, но для неправильных настроек или неправильного запроса. Параметры запроса и подключения должны соответствовать требованиям, указанным в Creating a Query for Notifications.

+0

В SqlNotificationEventArgs, я получаю значения, как указано ниже: Информация: Параметры Источник: Заявление Тип: Subscribe – Mahesh

+0

Ваши варианты подключения/окружающей среды являются недействительными уведомлений запроса. Прочтите ссылку, предоставленную для правильных настроек. –