我正在尝试使用Oracle 10g获取winform应用程序以刷新数据库更改的嵌入式浏览器。唯一的问题是我不能使用数据库更改通知。我很好奇是否有人有办法使用DBMS_Alert的内置包并且在数据库更改时对winform应用程序进行了一些操作。
谢谢,安德鲁
答案 0 :(得分:2)
如果您使用的是ODP,则可以使用Oracle Advanced Queuing/Streams 和here。
这样,您的表单应用程序可以订阅队列并收到更改通知。
如果您只是想在下拉列表中添加新的PO#,这可能对您的应用程序造成严重的过度杀伤!
之前我曾使用过溪流,它按预期工作,但它有很好的研究和试验水平。让事情点击的错误。
答案 1 :(得分:2)
我必须这样做才能发挥作用。它保持窗口锁定直到我知道事件发生,但至少它适用于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();
这给了我我需要的东西。我不知道是否有更好的方法,但这是我能想到的唯一解决方案。
答案 2 :(得分:1)
最好不使用计时器。以下代码示例使用后台线程
以下是代码段
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
}
}
}