Уведомление на основе запросов ODP.NET в Oracle - PullRequest
3 голосов
/ 17 ноября 2011

я пытаюсь использовать уведомления, основанные на запросах, но, похоже, по какой-то причине переключается на уведомление на основе объектов.Моя среда - Oracle 11.2 (я полагаю, вам нужен 11.1 или выше для работы запросов, основанных на запросах), и у меня есть оператор выбора, который извлекает столбец типа NUMBER.(Опять же, здесь я понимаю, что работают только столбцы varchar2 и number).Кажется, я получаю каждое уведомление об изменениях в таблице, а не только в своем набранном наборе данных

В качестве примера я создал образец таблицы с именем test_db_notification с одним столбцом типа NUMBER.

Добавлено дватам есть следующие записи:

SELECT rowid,column1 FROM test_db_notification;

ROWID                 COLUMN1

AAAERnAAKAAEurNAAI       54 
AAAERnAAKAAEurPAAA       63 

Вот мой код для регистрации для уведомления:

OracleCommand _cmdObj = _connObj.CreateCommand();
_cmdObj.CommandText = " SELECT column1 FROM test_db_notification where column1 = 63";
_dep = new OracleDependency(_cmdObj);
_dep.QueryBasedNotification = true; 
_dep.OnChange += new OnChangeEventHandler(_dep_OnChange);
_cmdObj.Notification.IsNotifiedOnce = false;
_cmdObj.AddRowid = true;
_cmdObj.ExecuteNonQuery();

Когда я регистрируюсь и изменяю значение column1, где текущее значение равно 54, я получаюназад уведомление о том, что ROWID для 54 был обновлен.Я ожидал, что не получу никаких уведомлений, поскольку мой исходный запрос выглядит только на column1 = 63.

Я что-то здесь упускаю?

Спасибо

Ответы [ 2 ]

1 голос
/ 03 июля 2014

Никогда не поздно опубликовать ответы в StackOverflow, так как люди (включая меня) продолжают искать вещи годами, когда вопрос задавался. Возможно, это не тот ответ, который вы ищете, но считайте это наблюдением, которое может привести вас в правильном направлении. У меня недостаточно очков, чтобы оставлять «комментарии», поэтому я набираю это как ответ.

Чтобы воссоздать проблему, я создал таблицу

CREATE TABLE TEST_DB_NOTIFICATION
(
  COLUMN1  VARCHAR2(1 BYTE),
  COLUMN2  VARCHAR2(1 BYTE)
)

Я использовал следующий код .Net (незначительные изменения в вашем)

private void button1_Click(object sender, RoutedEventArgs e)
{
    OracleConnection _connObj = new OracleConnection("Data Source=mydb;User Id=myid;Password=mypassword;");
    _connObj.Open();
    OracleCommand _cmdObj = _connObj.CreateCommand();
    _cmdObj.CommandText = " SELECT column1 FROM ods.test_db_notification where column1 = 'a' ";
    OracleDependency _dep = new OracleDependency(_cmdObj);
    _dep.QueryBasedNotification = true;
    _dep.OnChange += new OnChangeEventHandler(_dep_OnChange);
    _cmdObj.Notification.IsNotifiedOnce = false;
    _cmdObj.AddRowid = true;
    _cmdObj.ExecuteNonQuery();
}

void _dep_OnChange(object sender, OracleNotificationEventArgs eventArgs)
{
    MessageBox.Show("changed" + eventArgs.Details.Rows.Count);
}

По сути, я делаю то же самое, что и вы, но вместо этого я наблюдаю за Column1 = 'a'.

То, что я заметил, ниже:


** ВСТАВИТЬ поведение **

1) Когда я вставляю в таблицу, я получаю уведомление, когда новая строка имеет значение Column1 = 'a'. 2) Я не получаю уведомление, когда значение Column1 не равно «a».


** ОБНОВЛЕНИЕ поведения **

1) Когда я обновляю таблицу, в результате чего существующие значения в столбце 1 меняются на «а», а не на «а», я получаю уведомление. 2) Я получаю уведомление, почему я снова меняю столбцы, значение которых уже равно «a», чтобы быть «a». 3) Я получаю уведомление, если я изменяю значения с «a» на «z» в столбце 1.


** УДАЛИТЬ поведение **

1) Я получаю уведомление, когда удаляю строки со значением Column1 = 'a' 2) Я не получаю уведомление, когда значение Column1 не равно 'a'

Это приводит меня к очевидному выводу, что если есть какие-либо изменения в строках, которые квалифицируются как результаты оператора, который вы просматриваете (включая изменения, которые перезаписывают существующие значения для самого себя), вы получаете уведомление. Это соответствует поведению INSERT, UPDATE и DELETE.

0 голосов
/ 19 апреля 2016

Вставки не фиксируются уведомлением на основе запроса afaik.Если вы хотите захватить их, установите для _dep.QueryBasedNotification значение false (по умолчанию).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...