4

我正在尝试在 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 事件。

我还向 tu USR 用户授予了通知

grant change notification to USR

并且 job_queue_processes 大于零。

事实上,我使用的是 Oracle 数据库的Express 版本,这可能是一个问题吗?

4

2 回答 2

5

我找到了解决方案。问题不在Oracle数据库的版本中,而在版本中。Oracle 服务器的版本是11.2.0.2.0,客户端的版本是11.2.0.3.0,这个小差异导致了问题。

所以以后遇到类似问题时,一定要检查客户端和服务器的版本。

于 2012-06-08T12:52:54.490 回答
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();
于 2016-11-16T07:34:00.033 回答