Помощник
|
Использование Oracle UDT в asp.net |
Alcorn
|
Сообщение
#1
|
||
|
|
||
|
|||
Alcorn
|
Сообщение
#2
|
|
|
в) Objects.
Тут тоже, принцип создания по аналогии с предыдущими, Testobj.cs - [php] //------------------------------------------------------------------------------ // <auto-generated> // This code was generated by a tool. // Runtime Version:2.0.50727.1433 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // </auto-generated> //------------------------------------------------------------------------------ namespace testorcl { using System; using Oracle.DataAccess.Client; using Oracle.DataAccess.Types; using System.Xml.Serialization; using System.Xml.Schema; public class TESTOBJ : INullable, IOracleCustomType, IXmlSerializable { private bool m_IsNull; private string m_TEST_ID; public TESTOBJ() { // TODO : Add code to initialise the object } public TESTOBJ(string str) { // TODO : Add code to initialise the object based on the given string } public virtual bool IsNull { get { return this.m_IsNull; } } public static TESTOBJ Null { get { TESTOBJ obj = new TESTOBJ(); obj.m_IsNull = true; return obj; } } [OracleObjectMappingAttribute("TEST_ID")] public string TEST_ID { get { return this.m_TEST_ID; } set { this.m_TEST_ID = value; } } public virtual void FromCustomObject(Oracle.DataAccess.Client.OracleConnection con, System.IntPtr pUdt) { Oracle.DataAccess.Types.OracleUdt.SetValue(con, pUdt, "TEST_ID", this.TEST_ID); } public virtual void ToCustomObject(Oracle.DataAccess.Client.OracleConnection con, System.IntPtr pUdt) { this.TEST_ID = ((string)(Oracle.DataAccess.Types.OracleUdt.GetValue(con, pUdt, "TEST_ID"))); } public virtual void ReadXml(System.Xml.XmlReader reader) { // TODO : Read Serialized Xml Data } public virtual void WriteXml(System.Xml.XmlWriter writer) { // TODO : Serialize object to xml data } public virtual XmlSchema GetSchema() { // TODO : Implement GetSchema return null; } public override string ToString() { // TODO : Return a string that represents the current object return ""; } public static TESTOBJ Parse(string str) { // TODO : Add code needed to parse the string and get the object represented by the string return new TESTOBJ(); } } // Factory to create an object for the above class [OracleCustomTypeMappingAttribute("SHOP_USER.TESTOBJ")] public class TESTOBJFactory : IOracleCustomTypeFactory { public virtual IOracleCustomType CreateObject() { TESTOBJ obj = new TESTOBJ(); return obj; } } } [/php] Отправка/получение данных – [php] <% testorcl.TESTOBJ outobj = new testorcl.TESTOBJ(); outobj.TEST_ID = "Hello"; OracleConnection cons = new OracleConnection(); cons.ConnectionString = WebConfigurationManager.ConnectionStrings["oracle_conn"].ConnectionString; OracleCommand cmds = new OracleCommand("test.getobj", cons); cmds.CommandType = CommandType.StoredProcedure; OracleParameter parobj = new OracleParameter(); parobj.OracleDbType = OracleDbType.Object; parobj.UdtTypeName = "SHOP_USER.TESTOBJ"; parobj.Direction = ParameterDirection.Input; parobj.Size = 100; parobj.Value = outobj; parobj.ParameterName = "parobj"; cmds.Parameters.Add(parobj); OracleParameter par = new OracleParameter(); par.OracleDbType = OracleDbType.Object; par.UdtTypeName = "SHOP_USER.TESTOBJ"; par.Direction = ParameterDirection.Output; par.Size = 50; par.ParameterName = "par"; cmds.Parameters.Add(par); cons.Open(); cmds.ExecuteNonQuery(); Response.Write(((testorcl.TESTOBJ)(cmds.Parameters["par"].Value)).TEST_ID); cmds.Dispose(); cons.Close(); %> [/php] где TEST_ID – атрибут объекта. Associative Arrays (ассоциативные массивы). Этот тип данных не создаётся в Oracle types, а объявляется прямо в package (в данном примере), поэтому его обсуждение вынесено отдельно. Отличий от предыдущих вариантов довольно много - для данных плавающего размера, например varchar2, перед вызовом обязательно должен быть задан их размер, а также размер каждого элемента массива и общее их количество в каждом параметре, добавились новые параметры – ArrayBindStatus и ArrayBindSize. В отличие от предыдущих примеров, в Visual Studio никаких дополнительных UDT создавать не требуется. В этом примере отсылаем данные (ассоциативный массив) в процедуру, там их обрабатываем и возвращаем обратно. Сама pl/sql процедура приведена выше, а здесь код на c# - [php] <% OracleConnection cont = new OracleConnection(); cont.ConnectionString = WebConfigurationManager.ConnectionStrings["oracle_conn"].ConnectionString; OracleCommand cmdt = new OracleCommand("test.getmas", cont); cmdt.CommandType = CommandType.StoredProcedure; OracleParameter parmas = new OracleParameter(); parmas.CollectionType = OracleCollectionType.PLSQLAssociativeArray; parmas.OracleDbType = OracleDbType.Varchar2; parmas.Direction = ParameterDirection.Input; parmas.Size = 5; parmas.Value = new string[5] {"a", "b", "c", "d", "e"}; parmas.ArrayBindSize = new int[5] {1, 1, 1, 1, 1}; parmas.ParameterName = "parmas"; parmas.ArrayBindStatus = new OracleParameterStatus[5] { OracleParameterStatus.Success, OracleParameterStatus.Success, OracleParameterStatus.Success, OracleParameterStatus.Success, OracleParameterStatus.Success}; cmdt.Parameters.Add(parmas); OracleParameter parmasout = new OracleParameter(); parmasout.CollectionType = OracleCollectionType.PLSQLAssociativeArray; parmasout.OracleDbType = OracleDbType.Varchar2; parmasout.Direction = ParameterDirection.Output; parmasout.Size = 5; parmasout.ArrayBindSize = new int[5] {50, 50, 50, 50, 50}; parmasout.ParameterName = "parmasout"; cmdt.Parameters.Add(parmasout); cont.Open(); cmdt.ExecuteNonQuery(); for (int i = 0; i < ((Array)(cmdt.Parameters["parmasout"].Value)).Length; i++) { Response.Write(((Array)(cmdt.Parameters["parmasout"].Value)).GetValue(i) + "<br>"); } cmdt.Dispose(); cont.Close(); %> [/php] где в output-параметре parmasout.Size = 5; - количество элементов массива, ArrayBindSize 50 – максимальный размер каждого элемента (берётся из объявления типа в pl/sql процедуре). Порядок параметров. Во всех вышеприведённых примерах порядок объявления параметров должен строго совпадать с указанием этих параметров в pl/sql процедуре. В качестве аналога можно привести функцию – func(x,y). При её вызове мы передаём параметры как x,y, а не наоборот, как y,x. Тоже самое происходит и здесь, первый по счёту параметр в c# будет первым по счёту параметром и в pl/sql процедуре. При перемешивании параметров мы естественно получим ошибку. Но если мы хотим обойти это ограничение, то тут нам поможет связывание параметров по именам, тогда очередность их объявления в c# будет не важна. В этом случае основное правило – имя параметра в с# должно совпадать с именем параметра в вызываемой pl/sql процедуре. Имя параметра задаётся при его создании – [php] param.ParameterName = "paramout"; [/php] Далее после создания объекта OracleCommand добавим связывание по имени – [php] cmd.BindByName = true; [/php] Теперь можем располагать параметры в любом удобном для нас порядке. Всё тестировалось в Oracle 11g, .NET Framework 3.5, Visual Studio 2008, Windows 2003 Server Enterprise Edition SP2. © Автор Alcorn.
|
|
|
||
|
Похожие темы
Тема | Ответов | Автор | Просмотров | Последний ответ | |
---|---|---|---|---|---|
Betatransfer.net - прием платежей для HIGH RISK проектов, интернет эквайринг и мерчант онлайн оплат | 52 | arendator | 34149 | 26.3.2024, 4:43 автор: arendator |
|
HideHost.net - Виртуальные и выделенные сервера под любые Ваши проекты с индивидуальным подходом. Работаем уже более 12 лет |
6 | HIDEHOST | 2313 | 21.3.2024, 13:33 автор: Tihohodka |
|
PROXY6.NET - Индивидуальные прокси / IPv6 от 3.6 руб (29 подсеть) / IPv4 = 69.9 руб (RU/US/UA) | 113 | proxy6 | 70449 | 14.2.2024, 14:47 автор: proxy6 |
|
GogetTop.net - сервис аренды ссылок с сети PBN адалт тьюбо | 0 | Crimean | 905 | 18.12.2023, 12:20 автор: Crimean |
|
ВНИМАНИЕ: Pharmcash.net - монстр конверта Евро фарма траффика | 31 | Herbalka | 49782 | 11.12.2023, 21:26 автор: Herbalka |
Текстовая версия | Сейчас: 29.3.2024, 14:13 |