Вопрос

Нам нужно вернуть подмножество записей, и для этого мы используем следующую команду:

using (SqlCommand command = new SqlCommand(
                    "SELECT ID, Name, Flag, IsDefault FROM (SELECT ROW_NUMBER() OVER (ORDER BY @OrderBy DESC) as Row, ID, Name, Flag, IsDefault FROM dbo.Languages) results WHERE Row BETWEEN ((@Page - 1) * @ItemsPerPage + 1) AND (@Page * @ItemsPerPage)",
                    connection))

Я установил SqlCacheDependency, объявленный следующим образом:

SqlCacheDependency cacheDependency = new SqlCacheDependency(command);

Но сразу после запуска инструкции command.ExecuteReader(), имеетИзменено базовое свойство объекта SqlCacheDependency становится истинным, хотя я никак не менял результат запроса!И из-за этого результат этого запроса не сохраняется в кеше.

HttpRuntime.Cache.Insert( cacheKey, list, cacheDependency, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(AppConfiguration.CacheExpiration.VeryLowActivity));

Это потому, что команда имеет два оператора SELECT?Это ROW_NUMBER()?Если да, есть ли другой способ разбить результаты на страницы?

Пожалуйста помоги!После слишком многих часов немного будет очень ценно!Спасибо

Это было полезно?

Решение

Столкнувшись с той же проблемой и найдя те же ответы в Интернете без какой-либо помощи, я повторно искал ответ о недействительной подписке xml от профилировщика.

На сайте поддержки msdn я нашел пример с немного другим порядком кода.Когда я попробовал это, я понял проблему: не открывайте объект подключения до тех пор, пока вы не создадите объект команды и объект зависимости кэша.Вот порядок, которому вы должны следовать, и все будет хорошо:

  1. Обязательно включите уведомления (SqlCahceDependencyAdmin) и сначала запустите SqlDependency.Start.
  2. Создайте объект подключения
  3. Создайте объект команды и назначьте текст команды, тип и объект подключения (любая комбинация конструкторов, установка свойств или использование CreateCommand).
  4. Создайте объект зависимости кэша sql.
  5. Откройте объект подключения
  6. Выполнить запрос
  7. Добавьте элемент в кеш, используя зависимость.

Если вы следуете этому порядку и всем остальным требованиям в операторе выбора, у вас нет проблем с разрешениями, это сработает!

Я считаю, что проблема связана с тем, как платформа .NET управляет соединением, а именно с тем, какие настройки установлены.Я пытался переопределить это в тесте команд sql, но это не сработало.Это только предположение: я знаю, что изменение порядка немедленно решило проблему.

Мне удалось собрать это воедино из следующих сообщений msdn.

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

https://social.msdn.microsoft.com/Forums/en-US/cf3853f3-0ea1-41b9-987e-9922e5766066/change-default-set-options-forced-by-net?forum=adodotnetdataproviders

Тогда это сообщение было от пользователя, который, как и я, сократил свой код до самого простого формата.Мой исходный шаблон кода был похож на его.

https://social.technet.microsoft.com/Forums/windows/en-US/5a29d49b-8c2c-4fe8-b8de-d632a3f60f68/subscriptions-always-invalid-usual-suspects-checked-no-joy?forum=sqlservicebroker

Затем я нашел этот пост, также очень простое решение проблемы, только у него была простая проблема - для таблиц требовалось имя из двух частей.В его случае предложение решило проблему.Посмотрев на его код, я заметил, что основное отличие заключалось в том, что открытие объекта соединения ожидалось до тех пор, пока ПОСЛЕ создания объекта команды И объекта зависимости.Мое единственное предположение заключается в том, что под капотом (я еще не запустил отражатель для проверки, поэтому только предположение) объект Connection открывается по-другому или порядок событий и команд происходят по-другому из-за этой ассоциации.

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/bc9ca094-a989-4403-82c6-7f608ed462ce/sql-server-not-creating-subscription-for-simple-select-query-when- использование-sqlcachedependent?forum=sqlservicebroker

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

Другие советы

Всего лишь предположение, но может ли это быть потому, что ваш SELECT утверждение не имеет ORDER BY пункт?

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

Попробуйте добавить ORDER BY пункт:

SELECT ID, Name, Flag, IsDefault
FROM
(
    SELECT ROW_NUMBER() OVER (ORDER BY @OrderBy DESC) AS Row,
        ID, Name, Flag, IsDefault
    FROM dbo.Languages
) AS results
WHERE Row BETWEEN ((@Page - 1) * @ItemsPerPage + 1) AND (@Page * @ItemsPerPage)
ORDER BY Row

Я не эксперт по SqlCacheDependency, на самом деле я нашел этот вопрос, когда искал ответы на свои собственные проблемы с ним!Однако я считаю, что причина, по которой ваш SqlCacheDependency не работает, заключается в том, что ваш SQL содержит вложенный подзапрос.

Взгляните на документацию, в которой указано, что вы можете/не можете использовать в своем SQL: Создание запроса на уведомление

"....Операция не должна содержать подзапросы, внешние соединения или самосоединения....."

Я также нашел здесь бесценную информацию по устранению неполадок от парня из Redgate: Использование и мониторинг уведомлений о запросах SQL 2005 это помогло мне решить мою собственную проблему:Используя Sql Profiler для отслеживания событий QN, которые он предлагает, я смог обнаружить, что мое соединение было неправильно с использованием параметра «SET ARITHABORT OFF», что привело к сбою моих уведомлений.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top