Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有一种方法可以使用DBMS_Alert通知Winform应用程序数据库更改_C#_.net_Oracle_Plsql - Fatal编程技术网

C# 是否有一种方法可以使用DBMS_Alert通知Winform应用程序数据库更改

C# 是否有一种方法可以使用DBMS_Alert通知Winform应用程序数据库更改,c#,.net,oracle,plsql,C#,.net,Oracle,Plsql,我正在尝试使用Oracle 10g获取winform应用程序,以便在数据库更改时刷新嵌入式浏览器。唯一的问题是不允许我使用数据库更改通知。我很好奇是否有人有办法使用内置的DBMS_Alert包,并且在数据库更改时对winform应用程序执行了一些操作 谢谢你,安德鲁值得深思 如果您使用的是ODP,那么可以使用 和 这样,您的表单应用程序就可以订阅队列并收到更改通知 但是,如果您只想在下拉列表中添加一个新订单,那么这可能会大大超出您的应用程序的能力 我以前使用过streams,它的工作原理与预期一

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

谢谢你,安德鲁

值得深思

如果您使用的是ODP,那么可以使用 和

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

但是,如果您只想在下拉列表中添加一个新订单,那么这可能会大大超出您的应用程序的能力

我以前使用过streams,它的工作原理与预期一样,但它有很好的研究水平和尝试与错误,可以让东西点击。

值得思考

如果您使用的是ODP,那么可以使用 和

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

但是,如果您只想在下拉列表中添加一个新订单,那么这可能会大大超出您的应用程序的能力


我以前使用过streams,它可以正常工作,但它有很好的研究水平和尝试&错误,可以让东西点击。

我必须这样做才能工作。据我所知,它会一直锁定窗口,直到事件发生,但至少它可以与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();

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

我必须这样做才能让它工作。据我所知,它会一直锁定窗口,直到事件发生,但至少它可以与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
        }
    }
}

最好不用定时器。下面的代码示例使用后台线程

下面是代码片段

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
        }
    }
}

为什么不允许使用数据库更改通知?它正是针对这种类型的需求而制定的:“数据库更改通知是一种功能,它使客户端应用程序能够向数据库注册查询,并接收通知,以响应与查询关联的对象上的DML或DDL更改。”为什么不允许使用数据库更改通知?它正是针对这种类型的需求而设计的:“数据库更改通知是一种功能,它使客户端应用程序能够向数据库注册查询,并接收通知,以响应与查询关联的对象上的DML或DDL更改。”