Событие SqlDependency не запускается - PullRequest
1 голос
/ 21 октября 2011

Многие люди, кажется, имеют проблемы с выполнением этой работы, поэтому я не новичок здесь, надеясь, что кто-то сможет указать, что еще я могу проверить, это то, что я делаю ...

Среда: .net 4.0, SQL Server Exrpress 2008 R2

Шаги, предпринятые для настройки базы данных

CREATE QUEUE WebSiteCacheMessages ;

CREATE SERVICE WebCacheNotifications ON QUEUE WebSiteCacheMessages
  ([http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]) ;
CREATE ROUTE WebCacheMessagesRoute WITH SERVICE_NAME = 'WebCacheNotifications',ADDRESS = 'LOCAL' ;

EXEC sp_configure 'show advanced options', '1'
GO
RECONFIGURE
GO
EXEC sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO

ALTER DATABASE EFTest SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE
GO     
ALTER AUTHORIZATION ON DATABASE::[EFTEST] TO [domain\user];
GO

Следующий код для проверкиуведомление

     static void Main(string[] args)
        {
            var id = 0;
            string sqlStatement = "SELECT [Id] ,[FirstName],[LastName],[Email] FROM [dbo].[People]";
            string queueName = "WebSiteCacheMessages";
            string connectionString = ConfigurationManager.ConnectionStrings["MyDataContext"].ConnectionString;
            try
            {

                SqlDependency.Start(connectionString, queueName);
                using (var db = new DataContext(connectionString))
                {
                    var person = new Person { Email = "test@test.com", FirstName = "Testy", LastName = "Tester", HomeAddress = address };
                    db.Persons.Add(person);
                    db.SaveChanges();
                    id = person.Id;
                }
                var dependency = new SqlDependency();
                dependency.AddCommandDependency(new SqlCommand(sqlStatement));
                dependency.OnChange += (o, e) =>
                {
                    Console.WriteLine("Notification called !");
                };
                Console.ReadLine();
            }
            finally
            {
                SqlDependency.Stop(connectionString, queueName);
            }
        }

когда я запускаю инструкцию обновления для столбца электронной почты в окне запроса на сервере sql, я не вижу запускаемого события изменения.

В журнале событий нет событийили журналы базы данных, и когда я запускаю следующий запрос, я ничего не вижу

select * from WebSiteCacheMessages -- queue name
select * from sys.transmission_queue

большое спасибо за чтение этого ...

1 Ответ

3 голосов
/ 21 октября 2011

На самом деле вы не выполняете команду с SqlDependency. Вы просто связываете SqlDependency с SqlCommand, но на самом деле вы не выполняете SqlCommand. Уведомление о запросе на сервере создается только при выполнении оператора SQL. Что-то вроде:

var dependency = new SqlDependency();
var SqlCommand cmd = new SqlCommand(sqlStatement);
dependency.AddCommandDependency(cmd);
dependency.OnChange += (o, e) =>
{
    Console.WriteLine("Notification called !");
};

// Executing the command will submit the query notification request
using (SqlDataReader rdr = cmd.ExecuteReader ()) {
   while (rdr.Reader ()) {
      ...
   }
}
Console.Reade ();

Другой альтернативой является использование LinqToCache и запрос вашего DataContext.Persons:

var people = from p in db.Persons select new {p.Id, p.LastName, p.FirstName, p.Email};
var peopleCached = people.AsCached("Persons", new QueryCachedOptions () {
  OnInvalidate = (sender, args) => {
    Console.WriteLine("Notification called !");
  }
 });
// Again, the underlying SqlCommand must actually be executed. Iterate the query
foreach (p in peopleCached ) {
 ....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...