在C#中使用Oracle依赖关系更改通知

我正在尝试在c#中获取oracle数据库更改通知。 我找到了关于如何获取这些通知的本教程 。 我还创建了简单的win表单应用程序来捕获通知

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 cmd 100%正常。 我还试图以编程方式更改数据库,它更改了数据库中的数据,但没有激发OnChange事件。

我还授予了USR用户通知

 grant change notification to USR 

和job_queue_processes大于零。

可能是一个问题,我正在使用oracle数据库的Express版本

我找到了解决方案。 问题不是在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();