Quelqu'un sait comment mettre en œuvre la file d'attente Oracle Advance de C # à l'aide de PL / SSQL et ODP.NET? Je ne trouve pas d'exemple unique ou de ressource avec des exemples concrets en C # ou VB.NET. Idéalement, j'aimerais quelques exemples sur la manière dont les messages Enqueue et Dequeu avec types simples (XML / String). P>
5 Réponses :
AQ a une interface PLSQL via DBMS_AQ [ADM]. Tout ce dont vous avez besoin est de gérer ce forfait de votre environnement et des exemples et de configuration de AQ communs. Je ne pense pas qu'il y a quelque chose de spécial lorsque vous appelez ces forfaits de C #. P>
Désolé mais que je dois utiliser PL / SQL et les procédures stockées sont une partie intégrante de la question. Le problème est que lors de la déséquilibre des messages de nombreuses options sont disponibles par ex. le délai de connexion de la connexion. De plus, UDT sont utilisés comme paramètre pour le Proc - Je ne sais pas comment créer UDT de .net avec 10g. Ce que je cherche, quels sont quelques exemples de codes C # et de meilleures pratiques (par exemple, fermez la connexion DB ou laissez-la ouverte ???)
Est-ce que quelqu'un a un exemple à ce sujet? Je cherche aussi cela. ;)
Je ne connais pas la réponse exacte à ce problème, mais voici ce que nous avons fait: p>
La 2ème option est ce que j'ai fait pour déroger. Intéressant de voir qu'ils ont ajouté un soutien approprié dans .net via odp.net.
Je ne peux pas vous aider avec les meilleures pratiques, mais je peux vous aider avec une file d'attente UDT. Avant de traiter la file d'attente, vous devez générer des types personnalisés de la base de données dans votre projet C #. En supposant que vous avez installé Visual Studio et ODP.NET, vous devez simplement vous connecter à la base de données via l'Explorateur de serveur, localiser votre UDTS, cliquez avec le bouton droit de la souris et choisissez «Générer la classe personnalisée ...» Ces classes Carte directement sur vos UDT et sont utilisées Pour stocker les informations déséquilibrées.
Voici un exemple du code que vous utiliseriez pour enquisser un message: p> C'est un processus similaire à DEQUUE: P> 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;
}
Au cas où n'importe qui apparaît sur cette question, veuillez conscienter que le pilote ODP.NET, non exploité n'est pris en charge sur VS2019. Vous devrez installer VS2017 et 12.2 pour obtenir l'option fournisseur de données dans l'explorateur de serveur. Ce n'est qu'alors que vous pouvez générer automatiquement la classe UDT. 3 jours gaspillés. C'est Oracle pour vous.
Voici un bon exemple que j'ai trouvé à partir d'Oracle. P>
http://www.oracle. Com / TechNetwork / Problème-Archive / 2009/09-Nov / O69net-099734.html P>
Code: http: // www. oracle.com/techNetwork/issue-archive/2009/09-nov/o69odt-131369.zip p>
Les liens ne fonctionnent plus. Pour cette raison, il est généralement préférable de contourner également les pièces pertinentes de votre réponse avec le lien, de sorte que les informations ne deviennent pas indisponibles lorsque le lien cesse de fonctionner à l'avenir.
J'ai eu une exigence dans laquelle je devais en faire enticulée / déquendez des messages UDT à une file d'attente. Ce message était vraiment utile. Il a presque tout, mais la création d'un «type personnalisé Oracle» est manquante. Je pensais que sa valeur ajout de ce code ici afin que la solution soit complète.
en Enqueue / dequeue dans Oracle: P>
Utilisateur avec rôle "AQ_ADMInistrator_role" doit être créé. Dans l'exemple ci-dessous, le "AQUSER" est créé avec ce rôle. P>
PL Sql to EnQueue: DECLARE queue_options DBMS_AQ.ENQUEUE_OPTIONS_T; message_properties DBMS_AQ.MESSAGE_PROPERTIES_T; message_id RAW(16); my_message AQUSER.USER_DEFINED_TYPE; BEGIN my_message := AQUSER.USER_DEFINED_TYPE('XXX','YYY','ZZZ'); DBMS_AQ.ENQUEUE( queue_name => 'AQUSER.QUEUE_NAME', enqueue_options => queue_options, message_properties => message_properties, payload => my_message, msgid => message_id); COMMIT; END; / PL SQL to DeQueue DECLARE queue_options DBMS_AQ.DEQUEUE_OPTIONS_T; message_properties DBMS_AQ.MESSAGE_PROPERTIES_T; message_id RAW(2000); my_message AQUSER.USER_DEFINED_TYPE; BEGIN DBMS_AQ.DEQUEUE( queue_name => 'AQUSER.QUEUE_NAME', dequeue_options => queue_options, message_properties => message_properties, payload => my_message, msgid => message_id ); COMMIT; END; / ------------------------------------------------------------------------------------------- To create a Oracle Custom Type, you can use the following code: public class CustomMessageType : IOracleCustomType, INullable { [OracleObjectMappingAttribute("XXXXX")] public string XXXXX { get; set; } [OracleObjectMappingAttribute("YYYYY")] public string YYYYY { get; set; } [OracleObjectMappingAttribute("ZZZZZ")] public string ZZZZZ { get; set; } public void FromCustomObject(Oracle.DataAccess.Client.OracleConnection con, IntPtr pUdt) { if (!string.IsNullOrEmpty(XXXXX)) { OracleUdt.SetValue(con, pUdt, "XXXXX", XXXXX); } if (!string.IsNullOrEmpty(YYYYY)) { OracleUdt.SetValue(con, pUdt, "YYYYY", YYYYY); } if (!string.IsNullOrEmpty(ZZZZZ)) { OracleUdt.SetValue(con, pUdt, "ZZZZZ", ZZZZZ); } } public void ToCustomObject(Oracle.DataAccess.Client.OracleConnection con, IntPtr pUdt) { XXXXX = (string)OracleUdt.GetValue(con, pUdt, "XXXXX"); YYYYY = (string)OracleUdt.GetValue(con, pUdt, "YYYYY"); ZZZZZ = (string)OracleUdt.GetValue(con, pUdt, "ZZZZZ"); } public bool IsNull { get; set; } } [OracleCustomTypeMappingAttribute("SCHEMA.CUSTOM_TYPE")] public class QueueMessageTypeFactory : IOracleCustomTypeFactory { public IOracleCustomType CreateObject() { return new CustomMessageType(); } }
Puis-je obtenir plus de détails sur cette implémentation comme où sont appelées ces procédures stockées