2015-03-16 2 views
0

Я разрабатываю службу Windows, которая использует Oracle Advanced Queue для управления им. Объекты команд будут помещены в очередь, и служба удалит его и попытается выполнить задачу. Для управления услугой я также разработал небольшое командное приложение. Это приложение будет помещать команды в очередь, но мне также хотелось бы, чтобы он мог очистить очередь, вызвав dbms_aqadm.purge_queue_table всякий раз, когда нажата кнопка. Я пробовал это двумя способами. Сначала я попробовал:Очистка расширенной очереди Oracle в C#

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_table имеет 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. Поэтому в любом случае я получаю сообщения об ошибках, которые, если я не пропущу что-то, чего я не должен получать. Я не могу разобраться в этом. Может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно или как обойти это?

+0

Какую версию Oracle вы используете? Согласно [SO - проблемному вызову пакета с varchar2] (http://stackoverflow.com/questions/14883627/oracle-odp-net-problems-calling-package-procedure-with-parameters), в Oracle 9.2 есть ошибка .0.6.0, который вызывает переплетенные ошибки привязки VARCHAR2. –

+0

Мы находимся на версии 12c –

ответ

0

Держу пари, вам просто нужно:

cmd.BindByName = true; 
+0

Это, к сожалению, нет. Когда я изначально написал это приложение, я использовал ODP.net Oracle, которые используют позиционную привязку. Однако, когда я столкнулся с этой проблемой, я попытался использовать Microsoft System.Data.OracleClient, и это также не устранило проблему. System.Data.OracleClient связывает параметры по имени по умолчанию. –

Смежные вопросы