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

4

我正在尝试在C#中获取Oracle数据库更改通知。我找到了这个教程,介绍了如何获取这些通知。我还创建了一个简单的Windows窗体应用程序来捕获通知。

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都没有问题。我还尝试以编程方式更改数据库,它更改了数据库中的数据,但没有触发OnChange事件。

我还授予USR用户通知权限。

grant change notification to USR

如果job_queue_processes大于零,则可能存在问题。

我正在使用Oracle数据库的Express版,这会有问题吗?

2个回答

5
我找到了解决方案。问题不在Oracle数据库的版本上,而是在版本号上。Oracle服务器的版本是11.2.0.2.0,客户端的版本是11.2.0.3.0,这个微小的差异导致了问题。
因此,在遇到类似问题时,请始终检查客户端和服务器的版本。

那么,您是说这个功能需要数据库和客户端版本完全匹配才能正常工作?您是如何解决问题的?您降级了客户端吗? - shindigo
我在服务器和客户端上都安装了匹配的11.2.0.2.0版本,但无法使其正常工作。我可以在DBA_CHANGE_NOTIFICATION_REGS中看到更改通知的注册,但在监视表上提交后,注册会消失,我的应用程序也无法接收到通知。 - shindigo
抱歉,我不能帮你了。我们已经升级到11.2.0.3.0版本,我现在不记得它是否也适用于11.2.0.2.0版本。 - LadislavM
没问题 - 我会考虑升级的。谢谢。 - shindigo

1

另外,在您的代码中漏掉了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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接