2016-10-19 50 views
0

我有以下部署:ODP.NET通知不會在客戶端收到

A)服務器計算機:

  • 的Windows 7 - 64位 - SP1(英文)
  • Oracle數據庫11g快捷版
  • ODAC 11.2.0.1.2(僅適用於Oracle即時客戶端安裝11.2.0.1.0)

B)ç lient機:

  • 的Windows 7 - 32位 - SP1(西班牙)
  • 的Microsoft .NET Framework 4.0
  • ODAC 11.2.0.1.2(完全安裝)

在客戶端計算機我有一個非常簡單的應用程序,執行以下步驟:

  1. 創建一個OracleConnection
  2. 創建一個的OracleCommand(SELECT字段從表)
  3. 創建基於前面的命令

一旦執行這些步驟,我能夠在一個新的記錄已插入DBA_CHANGE_NOTIFICATION_REGS表看到一個OracleDependency。此記錄中的信息與我的客戶端設置(用戶連接,IP地址,IP端口)完全匹配。

然後,我修改數據庫以確保在修改後,要通知的查詢結果發生變化。我的應用程序應該被通知,但事實並非如此。

我已經檢查(使用Wireshark)修改後,有些流量通過DBA_CHANGE_NOTIFICATION_REGS中指定的端口從服務器發送到客戶端,但客戶端應用程序未通知它。

因此,似乎通知已正確創建,從服務器到客戶端計算機的通知也會發送,但通知未到達應用程序。

我還需要在客戶端接收通知?

在此先感謝....

下面的代碼我使用:

private void buttonConnectOracle_Click(object sender, EventArgs e) 
{ 
    String constr = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.164.10.202)(PORT=30005))" + 
        "(CONNECT_DATA=(SID=MASI)));User Id=dbuser;Password=dbuserpasswd;"; 

    try 
    { 
     OracleCon = new OracleConnection(constr); 
     OracleCon.Open(); 
     buttonConectarOracle.Enabled = false; 
     RegisterOracleCommandDependency(); 
    } 
    catch (Exception E) 
    { 
     MessageBox.Show(String.Format("ERROR connecting with Oracle BD: {0}{0}Connection string: {1}{0}{0}Error:{0}{2}", "\n\r", constr, E.Message)); 
    } 
} 

private void RegisterOracleCommandDependency() 
{ 
    String sql = "SELECT * FROM SCEHMA.REF"; 
    OracleCommand command = new OracleCommand(sql, OracleCon); 

    OracleDep = new OracleDependency(command); 
    command.Notification.IsNotifiedOnce = false; 

    command.ExecuteNonQuery(); 

    OracleDep.OnChange += new Oracle.DataAccess.Client.OnChangeEventHandler(OnMyNotificationOracle); 
} 

public void OnMyNotificationOracle(object src, OracleNotificationEventArgs args) 
{ 
    String logStr = "Notification received at " + DateTime.Now.ToString(); 
    //TODO: Add logStr to log 
} 
+0

您的客戶端應用程序是Web,控制檯還是Windows應用程序? – yopez83

+0

這是一個Windows應用程序。 –

+1

你有沒有檢查文檔?我認爲它包含您在「加載和運行更改通知演示應用程序」[3,4]中尋找的內容。讓我知道,如果你得到它的工作。 – yopez83

回答

0

檢查這個documentation。我認爲它會幫助你通知。

此外,請參閱this,如果以前的鏈接沒有幫助。

1

首先,感謝@b_levitt,@ yopez83和@Christian Shay的貢獻。

問題已解決:某些Oracle Server版本與相應的Oracle Client版本之間存在不兼容問題。

作爲一個總結,當服務器是11.2.0.2.0和客戶端是11.2.0.1.2時,通知不起作用。

這個查詢提供了有關Oracle服務器版本信息:

select * from v$version; 

在我的情況下,輸出是以下幾點:

Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production 
PL/SQL Release 11.2.0.2.0 - Production 
CORE 11.2.0.2.0 Production 
TNS for 64-bit Windows: Version 11.2.0.2.0 - Production 
NLSRTL Version 11.2.0.2.0 - Production 

希望這有助於....

+0

這是一個通過修補數據庫和客戶端來解決的錯誤。請參閱:http://stackoverflow.com/questions/25629461/oraclecommand-with-oracledependency-waiting-forever數據庫的終端版本是11.2.0.4,你應該使用它。 –

0

剛添加到上面的不兼容版本列表中; 我遇到與Oracle 11g版本11.2.0.3.0(64位)相同的問題,並使用ODP.NET(Oracle.ManagedDataAccess)版本12.1.24160719。

獲取USER_CHANGE_NOTIFICATION_REGS表中的條目(主機IP與我的客戶端IP不匹配,但是,嗯......)大約30秒後刪除此條目。插入時,OnChangeEventHandler從未在.Net客戶端觸發(使用基於對象的通知)。

難道兩個:

GRANT CHANGE NOTIFICATION TO [USER] 
GRANT EXECUTE ON DBMS_CHANGE_NOTIFICATION TO [USER] 

嘗試從現在的NuGet其他ODP.NET客戶端版本,下降到21年1月10日。沒有工作。在執行插入時,Wireshark在端口1005(由OracleDependency使用)上檢測不到任何流量。嘆。

更新:事實證明,回調失敗,原因是IP重定向已被安裝在服務器上,所以沒有指責甲骨文在這種情況下...小費總是以驗證USER_CHANGE_NOTIFICATION_REGS指定的IP地址。