Подписка SqlDependency регистрируется с помощью жестко запрограммированной команды SQL, но не с помощью LINQ. - PullRequest
0 голосов
/ 16 апреля 2011

Я пытаюсь получить уведомления о зависимости от SQL, работающие с LINQ.

Я успешно выполнил жестко запрограммированный текст команды:

   using (SqlConnection conn = new SqlConnection(ConnStr))
    {
        conn.Open();

        SqlCommand cmd = conn.CreateCommand();
        cmd.CommandText = "SELECT [t0].[discounttype] FROM [dbo].[discounts] AS [t0]";

        var dep = new SqlDependency(cmd);
        dep.OnChange += OnDataChange;

        using (SqlDataReader dr = cmd.ExecuteReader())
        {
            while (dr.Read()) { Console.WriteLine("Name = " + dr[0]); }
        }
    }

Я вижу событие QN: Subscription, указанное в Профилировщике SQL Server, с текстом, включающим subscription registered.После этого все в порядке - меня уведомляют, когда вносятся изменения в таблицу discounts.

Однако, если я пытаюсь выполнить тот же запрос, используя LINQ:

    using (TestNotifyDataContext dc = new TestNotifyDataContext(ConnStr))
    {
        var results = from d in dc.Discounts select d;

        SqlCommand cmd = (SqlCommand) dc.GetCommand(results);

        var dep = new SqlDependency(cmd);
        dep.OnChange += OnDataChange;

        List<Discount> table = results.ToList();

        foreach (var discount in table)
        {
            Console.WriteLine("L: " + discount.discounttype);
        }
    }

resultsвернулся правильно, но в Профилировщике нет события QN: Subscription (поэтому я не получаю уведомления об изменениях).В соответствии с http://www.simple -talk.com / sql / t-sql-программирования / использование-и-мониторинга-sql-2005-запрос-уведомление / должна быть запись с другим текстом в случае сбоя подпискизарегистрироваться, но это даже не так, поэтому кажется, что запрос даже не получен сервером.

Пожалуйста, кто-нибудь может сказать мне, что я сделал неправильно, или указать мне в правильном направлении.

1 Ответ

1 голос
/ 16 апреля 2011

Полагаю, это потому, что созданы два отдельных объекта SqlCommand, один в dc.GetCommand (results), а другой в results.ToList ();Таким образом, фактически выполненный объект SqlCommand не связан с объектом SqlDependency.

Попробуйте cmd.ExecuteReader и посмотрите, зарегистрирована ли зависимость get.

...