在 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 依赖关系更改通知的主要内容,如果未能解决你的问题,请参考以下文章

行为型Observer模式

有没有办法对 Oracle 中的更改通知进行故障排除?

在 C# 中检测打印机配置更改

Oracle 数据库更改通知和 ROWID

当另一个进程对文本文件进行更改时,C# 会收到通知

如何使用 c# 监控 SQL Server 表更改?