Какой тип БД должен использоваться при передаче объекта в процедуру в пакете Oracle с использованием ODP.NET (C #)? - PullRequest
0 голосов
/ 02 августа 2011

Привет! Я передаю объект процедуре в пакете oracle, используя ODP.NET (C #). Я использую ODP.NET из-за ассоциативных массивов. Я не могу найти oracledbtype.object в ODP.NET, чтобы сделать параметр oracledbtype для объекта. какой тип db я должен использовать для параметра на стороне .NET, используя ODP.NET.

         public Oracle.DataAccess.Client.OracleCommand oc = new Oracle.DataAccess.Client.OracleCommand();



        oc.Parameters.Add("Param1", OracleDbType.Varchar2).Value = txt_RequestId.Text;

        //assign the array to the parm
        Oracle.DataAccess.Client.OracleParameter additionalBusiness_AssocParm = new Oracle.DataAccess.Client.OracleParameter();

        // When I tried to assign parameter OracleDbType to Varchar2 it is generating an error [PLS-00306: wrong number or types of arguments in call to 'INSERT_REQUEST'].
        // When I tried to change that value to Object. It is giving compliation error that object dbtype doesn't exist in Oracle.Data.Client.OracleDbType
        additionalBusiness_AssocParm.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2;
        additionalBusiness_AssocParm.CollectionType = Oracle.DataAccess.Client.OracleCollectionType.PLSQLAssociativeArray;
        additionalBusiness_AssocParm.Direction = ParameterDirection.Input;
        additionalBusiness_AssocParm.Value = unitId; // unitId is an array of User defined type
        oc.Parameters.Add(additionalBusiness_AssocParm);

        try
        {
            DoQueryWithODP("TEST_PKG.INSERT_UNIT", true);
        }

Ответы [ 2 ]

1 голос
/ 04 августа 2011

хорошо, я попытаюсь заняться этим без вашей спецификации pl / sql, но посмотрим, как это работает.

Я буду использовать пример, предоставленный в установке ODP @% ORA_HOME% \ odp.net \ samples \ 2.x \ AssocArray \ AssocArray.sln как образец для разговора. но этот сайт тоже полезен Использование ассоциативных массивов PL / SQL (на самом деле это не ссылка на статью, предоставленную mservidio, тогда как эта статья была о ArrayBind не Ассоциативные массивы )


CREATE TABLE TestAssociativeArray(COL1 varchar2(20), COL2 varchar2(20)) ;
/
create or replace PACKAGE MyTestAssociativeArray AS 
   TYPE AssocArrayVarchar2_t is table of VARCHAR(20) index by BINARY_INTEGER;
    PROCEDURE TestVarchar2(Param1 IN TestAssociativeArray.COL1%type ,
                           Param2 IN AssocArrayVarchar2_t);
END MyTestAssociativeArray ;
/
create or replace package body MyTestAssociativeArray as
    PROCEDURE TestVarchar2(Param1 IN TestAssociativeArray.COL1%type ,
                           Param2 IN AssocArrayVarchar2_t) 
    AS
    i INTEGER ; 
    BEGIN
        FOR i in Param2.first..Param2.last LOOP
            insert into TestAssociativeArray(col1, col2) 
                        values (Param1 , Param2(i)) ;
        END LOOP ;
    END TestVarchar2 ;
END MyTestAssociativeArray  ;
/

теперь для .net кода:

static void Main(string[] args)
{
  // Connect
  string connectStr = getConnection();

  // Setup the Tables for sample

  OracleConnection connection = new OracleConnection(connectStr);
  OracleCommand cmd = new OracleCommand("MyTestAssociativeArray.TestVarchar2", connection);
  cmd.CommandType = CommandType.StoredProcedure ;

  OracleParameter param1 = cmd.Parameters.Add("param1", OracleDbType.Varchar2);
  OracleParameter param2 = cmd.Parameters.Add("param2", OracleDbType.Varchar2);

  // Setup the direction
  param1.Direction = ParameterDirection.Input;
  param2.Direction = ParameterDirection.Input;

  // Specify that we are binding PL/SQL Associative Array
  param2.CollectionType = OracleCollectionType.PLSQLAssociativeArray;

  param1.Value = "ConstantValue" ;
  param2.Value = new string[3]{"Val1",
                               "Val2",
                               "Val3"};


  try 
  {
    connection.Open();
    cmd.ExecuteNonQuery();
  }
  catch (Exception e)
  {
    Console.WriteLine(e.Message);
  }

}

и результаты (с очисткой)

select * from TestAssociativeArray
/
COL1                 COL2                 
-------------------- -------------------- 
ConstantValue        Val1                 
ConstantValue        Val2                 
ConstantValue        Val3  
/** --clean up
drop package MyTestAssociativeArray;
drop table TestAssociativeArray ;
**/

Однако, так как вы не опубликовали свою спецификацию, это может быть что-то простое: нуждаясь:

cmd.BindByName = true;

, поскольку ODP по умолчанию связывается по позиции, а не по имени (это сбивает с толку многих людей)

0 голосов
/ 03 августа 2011

Здесь должна быть вся необходимая информация. Я использовал эту статью раньше, чтобы выполнить то, что вы пытаетесь.

http://www.oracle.com/technetwork/issue-archive/2009/09-sep/o59odpnet-085168.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...