Уведомление о запросе на основе ODP.NET в Oracle

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

В качестве примера я создал тестовую таблицу с именем 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();

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

Я что-то пропустил?

Спасибо

2 ответа

Никогда не поздно публиковать ответы на 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'.

Что я заметил ниже:

** INSERT поведение **

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

** Поведение UPDATE **

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

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

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

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


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

licensed under cc by-sa 3.0 with attribution.