gpt4 book ai didi

.net - 带有.Net的Oracle高级队列

转载 作者:行者123 更新时间:2023-12-04 04:52:39 32 4
gpt4 key购买 nike

有人知道如何使用PL/SSQL和ODP.NET从C#实现Oracle Advance Queue吗?
我在C#或VB.NET中找不到单个示例或带有具体示例的资源。
理想情况下,我想要一些有关如何使用简单类型(XMl/字符串)使消息入队和出队的示例。

最佳答案

我无法为您提供最佳实践,但是我可以通过UDT Queue帮助您。在处理队列之前,您需要从数据库到C#项目中生成自定义类型。假设您已安装Visual Studio和ODP.NET,则只需通过服务器资源管理器连接到数据库,找到您的UDT,右键单击并选择“Generate Custom Class ...”。这些类直接映射到您的UDT并已使用存储出队信息。

这是用于排队消息的代码示例:

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

出队的过程与此类似:
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;

}

那是一个“简单”的例子。我将大部分内容从Ed Zehoo的Pro ODP.NET for Oracle Database 11g中删除。这是一本非常不错的书,我强烈建议您使用它来帮助您更好地了解OPD.NET的所有内容。您可以在此处购买eBook: http://apress.com/book/view/9781430228202。如果输入优惠券代码MACWORLDOC,则可以$ 21.00的价格获取电子书。该优惠仅对采用密码保护的PDF格式的电子书有用。我希望这有帮助!

关于.net - 带有.Net的Oracle高级队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1265750/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com