title: Using SqlDependency with named Queues
body: <p>I have the following code that uses SqlDependency to monitor changes in one of my databases  It works great, except every run it generates its own Queue/Service/Route with a guid in the database:</p>
  
  <p>Class:</p>
  
  <pre><code>class SqlWatcher
  {
      private string connectionString;
      private string sqlQueue;
      private string listenerQuery;
      private SqlDependency dependency;
  
      public SqlWatcher(string connectionString, string sqlQueue, string listenerQuery)
      {
          this.connectionString = connectionString;
          this.sqlQueue = sqlQueue;
          this.listenerQuery = listenerQuery;
          this.dependency = null;
      }
  
      public void Start()
      {
          SqlDependency.Start(connectionString);
          ListenForChanges();
      }
  
      public void Stop()
      {
          SqlDependency.Stop(this.connectionString);
      }
  
      private void ListenForChanges()
      {
          //Remove existing dependency, if necessary
          if (dependency != null)
          {
              dependency.OnChange -= onDependencyChange;
              dependency = null;
          }
  
          SqlConnection connection = new SqlConnection(connectionString);
          connection.Open();
  
          SqlCommand command = new SqlCommand(listenerQuery, connection);
  
          dependency = new SqlDependency(command);
  
          // Subscribe to the SqlDependency event.
          dependency.OnChange += new OnChangeEventHandler(onDependencyChange);
  
          SqlDependency.Start(connectionString);
  
          command.ExecuteReader();
  
          //Perform this action when SQL notifies of a change
          performAction();
  
          connection.Close();
      }
  
      private void onDependencyChange(Object o, SqlNotificationEventArgs args)
      {
          if ((args.Source.ToString() == "Data") || (args.Source.ToString() == "Timeout"))
          {
              Console.WriteLine(System.Environment.NewLine + "Refreshing data due to {0}", args.Source);
              ListenForChanges();
          }
          else
          {
              Console.WriteLine(System.Environment.NewLine + "Data not refreshed due to unexpected SqlNotificationEventArgs: Source={0}, Info={1}, Type={2}", args.Source, args.Info, args.Type.ToString());
          }
      }
  
      private void performAction()
      {
          Console.WriteLine("Performing action");
      }
  }
  </code></pre>
  
  <p>Execution:</p>
  
  <pre><code>static void Main(string[] args)
  {
     string connectionString = @"&lt;MY CONNECTION STRING&gt;"; 
     string sqlQueue = @"NamesQueue";
  
     //Listener query restrictions: http://msdn.microsoft.com/en-us/library/aewzkxxh.aspx
     string listenerQuery = "SELECT Value FROM dbo.Table WHERE Name = 'Test'";
  
     SqlWatcher w = new SqlWatcher(connectionString, sqlQueue, listenerQuery);
     w.Start();
     Thread.Sleep(10000);
     w.Stop();
  }
  </code></pre>
  
  <p>Instead of generating its own queue/service/route everytime, I would like to create them up front and then tell my program to use them.  </p>
  
  <p>I went ahead and created these objects on the database :</p>
  
  <pre><code>CREATE QUEUE NamesQueue;
  CREATE SERVICE NamesService ON QUEUE NamesQueue;
  CREATE ROUTE NamesRoute WITH SERVICE_NAME = 'NamesService', ADDRESS = 'LOCAL';
  </code></pre>
  
  <p>and modified my C# code to use this queue and service:</p>
  
  <pre><code>...
  SqlDependency.Start(connectionString, sqlQueue);
  ...
  SqlDependency.Stop(this.connectionString, sqlQueue);
  ...
  dependency = new SqlDependency(command, "service=NamesService;local database=&lt;MY DB&gt;", 0);
  ...
  SqlDependency.Start(connectionString,sqlQueue);
  ...
  </code></pre>
  
  <p>Making these code changes causes no queues to be created on-the-fly when I run my code, however my code no longer works and my app doesn't recognize changes made to my table/query.</p>
  
  <p>I have spent days trying to figure this out with no success, can anyone offer any advice? Thanks.</p>