使用Oracle10g对数据库进行更改的嵌入式浏览器。唯一的问题是我不允许使用数据库更改通知。我很好奇是否有人有办法使用内置的DBMS_Alert包并在数据库更改时对winform应用程序执行某些操作。谢谢,安德鲁需要考虑的事情...如果您使用的是ODP,则可以使用OracleAdvancedQueuing/Streams。这样您的表单应用程序就可以订阅队列并收到更改通知。但是,如果您只想向下拉列表中添加新的PO#s,这对您的应用程序来说可能是严重的矫枉过正!我以前使用过流,它按预期工作,但点击它是一个很好的研究和试验和错误水平。我必须这样做,因为它有效。它保持窗口锁定,直到我知道事件发生,但至少它适用于DBMS_Alert。我在计时器中设置了这段代码:OracleConnectionconn=newOracleConnection(ConnectionString);conn.Open();OracleCommandcmd=newOracleCommand("DECLAREn"+"MESSAGEVARCHAR2(1800):=null;n"+"STATUSINTEGER;n"+"BEGINn"+"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();这给了我我需要的东西。我不知道有没有更好的方法,但这是我能想到的唯一解决方案。最好在没有计时器的情况下使用。下面的代码示例是一个后台线程。这是一个代码片段。以上就是C#学习教程:有没有办法利用DBMS_Alert通知Winform应用数据库改变所有分享的内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注—privateThreadDBMSAlertThread;privatevoidDBMSAlert(boolRegister){try{stringsSql;if(Register)sSql="calldbms_alert.register('XYZ')";elsesSql="calldbms_alert.remove('XYZ')";dbmsAlert=newOracleCommand();dbmsAlert.CommandText=sSql;dbmsAlert.ExecuteNonQuery();if(Register)//启动后台线程{DBMSAlertThread=newThread(AlertEvent);DBMSAlertThread.IsBackground=true;DBMSAlertThread.Start();}}catch(ExceptionLclExp){//在事件日志中显示错误或捕获}}privatevoidAlertEvent(objectsender){while(true){stringMessage="";int状态=-1;boolb状态;OracleParameter参数;尝试{OracleCommanddbmsAlert=newOracleCommand();dbmsAlertScan.SQL.Add("调用dbms_alert.WaitOne('XYZ',:Message,:Status,0)");//最后一个参数表示等待时间param=newOracleParameter("Message",OracleDbType.Varchar2,ParameterDirection.Output);dbmsAlert.Parameters.Add(参数);param=newOracleParameter("状态",OracleDbType.Varchar2,ParameterDirection.Output);dbmsAlert.Parameters.Add(参数);OracleParameter.ExceuteNonQuery();Message=dbmsAlert.Parameters["Message"].Value.ToString();bStatus=int.TryParse(dbmsAlert.Parameters["Status"].Value.ToString(),outStatus);if(Status==0)//0=AlertReceived,1=Timedout{//notifyordourstuff}}catch(ExceptionExp){//raiseanerror}}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
