Есть ли способ использовать DBMS_Alert для уведомления приложения Winform об изменении базы данных - PullRequest
1 голос
/ 15 декабря 2010

Я пытаюсь получить приложение winform для обновления встроенного браузера при изменении базы данных с использованием Oracle 10g. Единственная проблема заключается в том, что мне не разрешено использовать уведомление об изменении базы данных. Мне любопытно, если у кого-нибудь есть способ использовать встроенный пакет DBMS_Alert и когда-нибудь произошло какое-либо действие с приложением winform при изменении базы данных.

Спасибо, Андрей

Ответы [ 3 ]

2 голосов
/ 16 декабря 2010

Я должен был сделать это так, чтобы это работало.Это держит окно в замке, пока событие не произойдет, я знаю, но по крайней мере это работает с 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 голосов
/ 15 декабря 2010

пища для размышлений ...

если вы используете ODP, вы можете использовать Oracle Advanced Queuing / Streams и здесь .

таким образом ваше приложение формы может подписаться на очередь и получать уведомления об изменениях.

Это может, однако, быть большим излишним для вашего приложения, если вы просто хотите добавить новый PO # в выпадающий список!

Я использовал потоки и раньше, и он работал, как и ожидалось, но у него был хороший уровень исследований и проб и ошибок, чтобы заставить что-то щелкать.

1 голос
/ 05 января 2013

Лучше использовать без таймера. Пример кода ниже с фоновым потоком

Вот фрагмент кода

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
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...