Уведомление об изменении с зависимостью Oracle в C #

Я пытаюсь получить уведомление о смене базы данных oracle в c #. Я нашел этот учебник о том, как получить эти уведомления. Я также создал приложение с простой формой выигрыша для обнаружения уведомлений

public partial class Form1 : Form { public Form1() { InitializeComponent(); SetUpNotification(); } private void SetUpNotification() { var login = "DATA SOURCE=XE;PERSIST SECURITY INFO=True;USER ID=USR;PASSWORD=PWD"; OracleConnection conn = null; OracleDependency dep = null; try { conn = new OracleConnection(login); var cmd = new OracleCommand("select * from customer_details", conn); conn.Open(); cmd.AddRowid = true; dep = new OracleDependency(cmd); cmd.Notification.IsNotifiedOnce = false; dep.OnChange += new OnChangeEventHandler(dep_OnChange); } catch(Exception e) { MessageBox.Show(e.Message, e.Source, MessageBoxButtons.OK, MessageBoxIcon.Error); } } void dep_OnChange(object sender, OracleNotificationEventArgs eventArgs) { MessageBox.Show(eventArgs.Details.ToString(), "Database changed"); } } 

Строка входа и командлет OracleCommand на 100% хороши. Я также пытался программно изменить базу данных, изменил данные в базе данных, но не уволил событие OnChange.

Я также предоставил уведомления пользователю USR

 grant change notification to USR 

и job_queue_processes больше нуля.

Может быть проблема в том, что я использую express-выпуск базы данных oracleа?

Я нашел решение. Проблема не в выпуске базы данных Oracle, а в версии. Версия сервера Oracle была 11.2.0.2.0, а версия клиента была 11.2.0.3.0, и эта небольшая разница вызывала проблему.

Поэтому для будущего всегда проверяйте версии клиента и сервера, когда сталкиваетесь с подобной проблемой.

Также вы пропустили cmd.ExecuteNonQuery() в своем коде. Без выполнения команды этот код не будет работать независимо от версии базы данных.

 var cmd = new OracleCommand("select * from new_place", conn); conn.Open(); cmd.AddRowid = true; var dep = new OracleDependency(cmd); dep.OnChange += new OnChangeEventHandler(dep_OnChange); cmd.ExecuteNonQuery();