2012-06-07 61 views
2

我試圖在c#中獲取oracle數據庫更改通知。我找到了關於如何獲取這些通知的 this tutorial。我還創建了簡單的勝利表格應用程序來捕獲通知在C#中使用Oracle依賴關係更改通知#

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數據庫?

回答

4

我找到了解決方案。問題不在Oracle數據庫的版本中,而是在版本中。 Oracle服務器的版本是11.2.0.2.0和客戶端的版本是11.2.0.3.0和這個小差異導致了問題。

因此,在未來,當遇到類似問題時,一定要檢查客戶端和服務器的版本。

+0

那麼,你是說這個功能工作,數據庫和客戶端版本必須完全匹配?你做了什麼來解決這個問題?你降級了你的客戶嗎? – shindigo

+0

我在服務器和客戶端上有匹配的11.2.0.2.0版本,我不能得到這個工作。我在DBA_CHANGE_NOTIFICATION_REGS中看到更改通知的註冊,但在監視表上提交後,註冊消失,我的應用程序未收到通知。 – shindigo

+0

對不起,我不會幫你。我們已經升級到11.2.0.3.0,現在我不記得它是否也與11.2.0.2.0一起工作 – LadislavM

0

另外你在代碼中錯過了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();