C # OracleDependency onChange запускается несколько раз

#c# #.net #oracle

#c# #.net #Oracle

Вопрос:

Насколько я понимаю, OracleDependency может быть привязан к мониторингу запроса (а не только таблицы). Я создаю 2 объекта command и 2 объекта dependency, но запрос для обоих содержит разные предложения where, поэтому они должны просматривать 2 разных подмножества этой таблицы.

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


OracleDependency OraDep = (OracleDependency)sender;
string sql = (string)OraDep.RegisteredResources[0];

Итак, я настраиваю 2 запроса к одной и той же таблице с разным значением предложения where. Затем я захожу в базу данных и изменяю один из них, но, к моему удивлению, onChange запускается даже дважды, и приведенный выше код для получения запроса показывает оба запроса.

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

Ответ №1:

Уведомление об изменении Oracle отслеживает объекты, а не запросы. При любом изменении в таблице новая запись вставляется, обновляется или удаляется, добавляется новый столбец, переименовывается / удаляется. Вот причина, по которой вы видите уведомления 2 раза.

Один из способов — вызвать хранимые процедуры вместо запросов. Принять только 1 уведомление. Событие уведомления e.info сообщает вам, что это за операция: вставить / обновить / удалить. Таким образом, вы можете написать условие if, чтобы отвечать только на уведомления о вставке, и на основе этого вы можете вызвать соответствующий sp или запрос.

Надеюсь, это поможет.

Комментарии:

1. Тогда, наверное, у меня проблема. В этом событии изменения мне нужно знать, что изменилось. Кажется, я не вижу ничего, что могло бы показать мне эту информацию. Это кажется странным, поскольку я видел примеры, у которых есть предложение where в передаваемом ими cmd, но да, я вижу, что, похоже, это не так, но это все равно оставляет меня с необходимостью узнать, что изменилось в моем приложении C #.

2. Позвольте мне пояснить, что означает «что изменилось». Я имею в виду запись, которая изменилась (когда тип сообщения — update), а не только то, какая таблица изменилась (поскольку я бы все равно знал это с момента настройки cmd).

3. @пользователь441521, поскольку вас интересует только обновление. В обработчике событий у вас может быть условие if для if(e.info. toString() == «Обновить») { Process} остальное игнорировать.

4. Да, этого было недостаточно, чтобы узнать, какая запись была обновлена. Однако я понял это. В объекте command, который вы присоединяете к объекту dependency, вы устанавливаете идентификатор включаемой строки равным true, затем внутри аргументов события обратного вызова для зависимости onchange вы можете получить идентификаторы строк oracle и запросить таблицу, чтобы получить записи, которые изменились. Спасибо.