Search code examples
objectodp.netuser-defined-types

Does ODP.net support UDT field inside another UDT


I have two User Defined Types in my schema:

create or replace
TYPE CITIZEN
AS
  OBJECT
  (
    PIN           VARCHAR2(7 CHAR),
    LNAME         VARCHAR2(30 CHAR) ,
    FNAME         VARCHAR2(30 CHAR), 
    .....)

create or replace
TYPE INW_DOC
AS
  OBJECT
  (
    CITIZEN DOKCENTRA.CITIZEN,
    SUBJECTID          NUMBER(2,0),
    CONCERNED_FIELD NUMBER(1,0),
    APPTYPE            NUMBER(2,0),
    REMARKS            VARCHAR2(1000 CHAR),
    ......)

I've generated the corresponding classes using ODP.NET Visual Studio tool. With below code I try to execute a stored procedure that takes one input parameter of type INW_DOC:

OracleConnection con= new OracleConnection(connectionString);
OracleCommand cmd=con.CreateCommand();
cmd.CommandText="PKG$DOCS.SAVE_DOC";
cmd.CommandType=CommandType.StoredProcedure;
OracleParameter param = new OracleParameter();
param.ParameterName = "V_INW_DOC";
param.UdtTypeName = "MySchema.INW_DOC";
param.OracleDbType = OracleDbType.Object;
param.Value = GetNewInwDoc();
param.Direction = ParameterDirection.Input;
cmd.Parameters.Add(param);
con.Open();
cmd.ExecuteNonQuery();

I get ArgumentException "Invalid parameter binding" exception. I don't have much to check other than the correctness of the parameter name and parameter type. I'm afraid of having wasted tons of time before realizing that it's just ODP.NET not supporting UDT field inside another UDT. Any ideas?


Solution

  • While I can't state the real problem, changing the OracleDataAccess.dll version from 2.xxx to 4.xxx solved the problem.