在 C# 中使用 Oracle 依赖关系更改通知
Posted
技术标签:
【中文标题】在 C# 中使用 Oracle 依赖关系更改通知【英文标题】:Change Notification with Oracle Dependency in C# 【发布时间】:2012-06-11 13:49:05 【问题描述】:我正在尝试在 c# 中获取 oracle 数据库更改通知。我发现 this tutorial 关于如何获取这些通知。我还创建了用于捕获通知的简单 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 大于零。
我使用的是 Express edition 的 oracle 数据库,这可能是一个问题吗?
【问题讨论】:
【参考方案1】:我找到了解决方案。问题不在Oracle数据库的版本中,而在版本中。 Oracle 服务器的版本是11.2.0.2.0,客户端的版本是11.2.0.3.0,这个小差异导致了问题。
所以以后遇到类似问题时,一定要检查客户端和服务器的版本。
【讨论】:
那么,您是说要使此功能起作用,数据库和客户端版本必须完全匹配?你做了什么来解决这个问题?你降级了你的客户吗? 我在服务器和客户端上有匹配的 11.2.0.2.0 版本,但我无法让它工作。我在 DBA_CHANGE_NOTIFICATION_REGS 中看到了更改通知的注册,但是在监控表上提交后,注册消失了,我的应用没有收到通知。 对不起,我不会帮助你。我们已经升级到 11.2.0.3.0,我现在不记得它是否也适用于 11.2.0.2.0 没问题 - 我会考虑升级。谢谢。【参考方案2】:您还错过了代码中的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();
【讨论】:
以上是关于在 C# 中使用 Oracle 依赖关系更改通知的主要内容,如果未能解决你的问题,请参考以下文章