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 コマンドは 100% 問題ありません。プログラムでデータベースを変更しようとしましたが、データベースのデータが変更されましたが、OnChange イベントは発生しませんでした。

USRユーザーにも通知を許可しました

grant change notification to USR

job_queue_processes が 0 より大きい。

実際、 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 に答える