Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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# 在C中清除Oracle高级队列#_C#_Oracle_Plsql_Advanced Queuing - Fatal编程技术网

C# 在C中清除Oracle高级队列#

C# 在C中清除Oracle高级队列#,c#,oracle,plsql,advanced-queuing,C#,Oracle,Plsql,Advanced Queuing,我正在开发一个Windows服务,它使用Oracle高级队列来控制它。命令对象将放置在队列上,服务将使其退出队列并尝试执行任务。为了控制服务,我还开发了一个小型命令应用程序。此应用程序将在队列上放置命令,但我也希望它能够在按下按钮时通过调用dbms_aqadm.purge_queue_table来清除队列。我试过两种方法。首先,我尝试: using (OracleConnection conn = new OracleConnection(ConfigurationManager.Connect

我正在开发一个Windows服务,它使用Oracle高级队列来控制它。命令对象将放置在队列上,服务将使其退出队列并尝试执行任务。为了控制服务,我还开发了一个小型命令应用程序。此应用程序将在队列上放置命令,但我也希望它能够在按下按钮时通过调用dbms_aqadm.purge_queue_table来清除队列。我试过两种方法。首先,我尝试:

using (OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
    conn.Open();

    OracleCommand cmd = conn.CreateCommand();

    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "dbms_aqadm.purge_queue_table";

    cmd.Parameters.Add("queue_table", "PRISMPRO_Q_TAB");
    cmd.Parameters.Add("purge_condition", DBNull.Value);
    cmd.Parameters.Add("purge_options", DBNull.Value);

    cmd.ExecuteNonQuery();

    conn.Close();
}
我得到以下错误:

ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'PURGE_QUEUE_TABLE'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
dbms_aqadm.purge_queue_表有3个参数,我给它传递了3个参数。此外,它们的类型是正确的。没有我能说的最好的理由来解释为什么会发生这个错误。我无法想出如何让它消失,因此我尝试了以下方法:

using (OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
    conn.Open();

    OracleCommand cmd = conn.CreateCommand();

    cmd.CommandType = CommandType.Text;
    cmd.CommandText = "exec dbms_aqadm.purge_queue_table('PRISMPRO_Q_TAB', NULL, NULL)";

    cmd.ExecuteNonQuery();

    conn.Close();
}
并得到了错误信息:

ORA-00900: invalid SQL statement
SQL语句不是无效的。它在SQL Developer中运行良好。因此,在任何一种情况下,我都会收到错误消息,除非我错过了一些我不应该得到的东西。我想不出一个解决办法。有人能告诉我我做错了什么,或者如何解决这个问题吗?

我打赌你只需要:

cmd.BindByName = true;

不幸的是,事实并非如此。当我最初编写这个应用程序时,我使用了Oracle的ODP.net,它使用位置绑定。然而,当我遇到这个问题时,我尝试使用Microsoft的System.Data.OracleClient,但也没有解决问题。默认情况下,System.Data.OracleClient按名称绑定参数。您使用的是哪个Oracle版本?根据,Oracle 9.2.0.6.0中存在导致间歇性VARCHAR2绑定错误的错误。我们使用的是版本12c