'Тип сбора для типа данных полезной нагрузки MSG_TYPE не существует.' - PullRequest
0 голосов
/ 30 ноября 2018

Я успешно исключаю очередь Oracle Advanced Queue с помощью следующего кода:

OracleQueue oracleDequeueQueue = new OracleQueue("QUEUENAME", oracleConnection);
OracleQueueMessage msg = oracleDequeueQueue.Dequeue();

if (msg != null && msg.ObjectPayload != null)
{
    Convert.ToString(msg.ObjectPayload["ID"])
}

Когда я пытаюсь собрать массив очереди с помощью следующего фрагмента кода, я получаю сообщение об ошибке

System.Exception: 'Тип коллекции для типа данных полезной нагрузки SCH.MDM_MESSAGE_TYPE не существует.'

OracleQueue oracleDequeueQueue = new OracleQueue("QUEUENAME", oracleConnection);
OracleQueueMessage[] msgArr = oracleDequeueQueue.DequeueArray(10);

foreach (OracleQueueMessage m in msgArr)
{
    if (m != null && m.ObjectPayload != null)
    {
        Convert.ToString(m.ObjectPayload["ID"]));
    }
}

Я также попытался добавить следующее, но это также не работает:

oracleDequeueQueue.PayloadTypeName = "SCH.MDM_MESSAGE_TYPE";oracleDequeueQueue.PayloadArrayTypeName = "SCH.MDM_MESSAGE_TYPE_ARRAY";

Что не так с моим кодом?

Это код очереди в Oracle:

create or replace type mdm_message_type as object ( id number(12 ) );

create or replace TYPE mdm_message_type_array as table of    mdm_message_type;

exec DBMS_AQADM.CREATE_QUEUE_TABLE(     Queue_table        => '"SCH"."MDM_CUSTOMER_T"',     Queue_payload_type => 'SCH.MDM_MESSAGE_TYPE');
exec DBMS_AQADM.CREATE_QUEUE(     Queue_name          => 'SCH.MDM_CUSTOMER',     Queue_table         => 'SCH.MDM_CUSTOMER_T',     Queue_type          =>  0,     Max_retries         =>  10000,     Retry_delay         =>  0,     dependency_tracking =>  FALSE);
exec dbms_aqadm.start_queue( 'SCH.MDM_CUSTOMER',true,true);

1 Ответ

0 голосов
/ 21 января 2019

Когда вы используете метод DequeueArray, у вас должен быть следующий тип массива в Oracle:

CREATE TYPE MESSAGE_ARRAY IS VARRAY (100) OF MESSAGE_TYPE_NAME

Обратите внимание, что длина массива MESSAGE_TYPE_NAME, созданного в Oracle, должна быть равна или больше значенияпараметр в методе DequeueArray в вашем коде .NET.

...