2009-11-19 3 views
1

J'ai une application console dans laquelle je fais sqldependency. Mon problème est quand j'ai placé commandType en tant que texte, cela fonctionne très bien. Mais si j'utilise commandType comme StoredProcedure, la méthode onchange appelle indéfiniment.Windows Application SqlDepedency Appel Onchange infini

S'il vous plaît voir le code ci-dessous:



     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(); 
     } 

Ma procédure stockée est:



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 

Si je copie l'instruction select dans la procédure stockée comme mon texte de commande et définissez les CommandType sous forme de texte, tout fonctionne bien.

pouvez-vous s'il vous plaît laissez-moi savoir quel est le problème ????

Merci beaucoup d'avance.

Mahesh

Répondre

1

Vous êtes censé vérifier les valeurs de l'argument SqlNotificationEventArgs. Seulement si Type est Change et Source est Data où vous avez notifié un changement de données.

Vous découvrirez que vous n'êtes pas averti des modifications de données, mais de paramètres incorrects ou d'une requête incorrecte. Vos paramètres de requête et de connexion doivent être conformes aux exigences spécifiées dans Creating a Query for Notifications.

+0

En SqlNotificationEventArgs, je reçois des valeurs indiquées ci-dessous: Info: Options de Source: Déclaration Type: Abonnez-vous – Mahesh

+0

Vos options de connexion/environnement ne sont pas valides pour les notifications de requête. Lisez le lien que j'ai fourni pour les paramètres corrects. –