有没有办法使用DBMS_Alert通知Winform应用程序数据库更改

我正在尝试使用Oracle 10g获取winform应用程序以刷新数据库更改的嵌入式浏览器。 唯一的问题是我不被允许使用数据库更改通知。 我很好奇是否有人有办法使用DBMS_Alert的内置包并且在数据库更改时对winform应用程序进行了一些操作。

谢谢,安德鲁

值得思考的东西……

如果您使用的是ODP,则可以使用Oracle Advanced Queuing / Streams 。

这样,您的表单应用程序可以订阅队列并收到更改通知。

但是,如果您只是想在下拉列表中添加新的PO#,这可能对您的应用程序造成严重的过度杀伤!

我之前使用过流,它按预期工作,但它具有很好的研究水平和试验和错误,可以点击。

我不得不这样做,因为它工作。 它保持窗口锁定直到我知道事件发生,但至少它适用于DBMS_Alert。 我在定时器中设置了这个代码:

OracleConnection conn = new OracleConnection(ConnectionString); conn.Open(); OracleCommand cmd = new OracleCommand("DECLARE\n" + "MESSAGE VARCHAR2(1800) := null;\n" + "STATUS INTEGER;\n" + "BEGIN\n" + "DBMS_ALERT.REGISTER('ALERT');\n" + "DBMS_ALERT.WAITONE('ALERT', MESSAGE, STATUS);\n" + "DBMS_ALERT.REMOVE('ALERT');\n" + "END;", conn); cmd.ExecuteNonQuery(); wbMain.Refresh(); conn.Dispose(); 

这给了我我需要的东西。 我不知道是否有更好的方法,但这是我能想到的唯一解决方案。

没有计时器最好使用。 下面的代码示例是后台线程

这是代码片段

 privateThread DBMSAlertThread; private void DBMSAlert(bool Register) { try { string sSql; if (Register) sSql = "call dbms_alert.register('XYZ')"; else sSql = "call dbms_alert.remove('XYZ')"; dbmsAlert = new OracleCommand(); dbmsAlert.CommandText = sSql; dbmsAlert.ExecuteNonQuery(); if (Register) //start the background thread { DBMSAlertThread = new Thread(AlertEvent); DBMSAlertThread.IsBackground = true; DBMSAlertThread.Start(); } } catch (Exception LclExp) { //Show error or capture in eventlog } } private void AlertEvent(object sender) { while (true) { string Message = ""; int Status = -1; bool bStatus; OracleParameter param; try { OracleCommand dbmsAlert = new OracleCommand(); dbmsAlertScan.SQL.Add("call dbms_alert.WaitOne('XYZ', :Message, :Status, 0)"); //Last parameter indicate wait time param = new OracleParameter("Message", OracleDbType.Varchar2, ParameterDirection.Output); dbmsAlert.Parameters.Add(param); param = new OracleParameter("Status", OracleDbType.Varchar2, ParameterDirection.Output); dbmsAlert.Parameters.Add(param); OracleParameter.ExceuteNonQuery(); Message = dbmsAlert.Parameters["Message"].Value.ToString(); bStatus = int.TryParse(dbmsAlert.Parameters["Status"].Value.ToString(), out Status); if (Status == 0) //0 = Alert Received, 1 = Timed out { //notify or do ur stuff } } catch (Exception Exp) { //raise an error } } }