Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Enfileiramento Avançado Oracle com .Net


Não posso ajudá-lo com as práticas recomendadas, mas posso ajudá-lo com uma Fila UDT. Antes de lidar com a fila, você precisa gerar tipos personalizados do banco de dados em seu projeto C#. Supondo que você tenha o Visual Studio e o ODP.NET instalados, basta se conectar ao banco de dados através do Server Explorer, localizar seus UDTs, clicar com o botão direito do mouse e escolher "Generate Custom Class..." Essas classes mapeiam diretamente para seus UDTs e são usadas para armazenar as informações de Dequeued.

Aqui está um exemplo do código que você usaria para enfileirar uma mensagem:
private void main(string[] args)
{
    string _connstring = "Data Source=host/DB;User
    Id=USER;Password=PASSWORD1;";

        OracleConnection _connObj = new OracleConnection(_connstring);

        // Create a new queue object
        OracleAQQueue _queueObj = new OracleAQQueue("UDT_NAME", _connObj);

        _connObj.Open();

        OracleTransaction _txn = _connObj.BeginTransaction();

        // Set the payload type to your UDT
        _queueObj.MessageType = OracleAQMessageType.Udt;
        _queueObj.UdtTypeName = "UDT_NAME";

        // Create a new message object
        OracleAQMessage _msg = new OracleAQMessage();

        // Create an instance of JobClass and pass it in as the payload for the
        // message
        UDT_CUSTOM_CLASS _custClass = new UDT_CUSTOM_CLASS();
        // Load up all of the properties of custClass
        custClass.CustString = "Custom String";
        custClass.CustInt = 5;

        _msg.Payload = custClass;

        // Enqueue the message
        _queueObj.EnqueueOptions.Visibility = OracleAQVisibilityMode.OnCommit;
        _queueObj.Enqueue(_msg);

        _txn.Commit();
        _queueObj.Dispose();
        _connObj.Close();
        _connObj.Dispose();
        _connObj = null;
}

É um processo semelhante para desenfileirar:
private void main(string[] args)
{
    string _connstring = "Data Source=host/DB;User
    Id=USER;Password=PASSWORD1;";

    OracleConnection _connObj = new OracleConnection(_connstring);

    // Create a new queue object
    OracleAQQueue _queueObj = new OracleAQQueue("UDT_NAME", _connObj);

    // Set the payload type to your UDT
    _queueObj.MessageType = OracleAQMessageType.Udt;
    _queueObj.UdtTypeName = "UDT_NAME";

    _connObj.Open();

    OracleTransaction _txn = _connObj.BeginTransaction();

    // Dequeue the message.
    _queueObj.DequeueOptions.Visibility = OracleAQVisibilityMode.OnCommit;
    _queueObj.DequeueOptions.Wait = 10;
    OracleAQMessage _deqMsg = _queueObj.Dequeue();

    UDT_CUSTOM_CLASS data = (UDT_CUSTOM_CLASS)_deqMsg.Payload;

    // At this point, you have the data and can do whatever you need to do with it

    _txn.Commit();
    _queueObj.Dispose();
    _connObj.Close();
    _connObj.Dispose();
    _connObj = null;

}

Esse é um exemplo "simples". Tirei a maior parte disso do Pro ODP.NET para Oracle Database 11g de Ed Zehoo. É um livro excelente e eu o recomendo fortemente para ajudá-lo a obter uma melhor compreensão dos prós e contras de todas as coisas do OPD.NET. Você pode comprar o eBook aqui:http://apress.com/book/view/9781430228202 . Se você inserir o código de cupom MACWORLDOC, poderá obter o eBook por US$ 21,00. Essa oferta é válida apenas para o eBook que vem em formato PDF protegido por senha. Eu espero que isso ajude!