Oracle Custom Types

I want to access Oracle Spatial data, I have found many references to C# using the following code:

> [OracleCustomTypeMappingAttribute("MDSYS.SDO_GEOMETRY")]
>   public class SdoGeometry : OracleCustomTypeBase<SdoGeometry>
>   {
>     private enum OracleObjectColumns { SDO_GTYPE, SDO_SRID, SDO_POINT, SDO_ELEM_INFO, SDO_ORDINATES }
>     private decimal? sdo_Gtype;
>     [OracleObjectMappingAttribute(0)]
>     public decimal? Sdo_Gtype
>     {
>       get { return sdo_Gtype; }
>       set { sdo_Gtype = value; }
>     }
>     private decimal? sdo_Srid;
>     [OracleObjectMappingAttribute(1)]
>     public decimal? Sdo_Srid
>     {
>       get { return sdo_Srid; }
>       set { sdo_Srid = value; }
>     }
>     private SdoPoint point;
>     [OracleObjectMappingAttribute(2)]
>     public SdoPoint Point
>     {
>       get { return point; }
>       set { point = value; }
>     }
>     private decimal[] elemArray;
>     [OracleObjectMappingAttribute(3)]
>     public decimal[] ElemArray
>     {
>       get { return elemArray; }
>       set { elemArray = value; }
>     }
>     private decimal[] ordinatesArray;
>     [OracleObjectMappingAttribute(4)]
>     public decimal[] OrdinatesArray
>     {
>       get { return ordinatesArray; }
>       set { ordinatesArray = value; }
>     }
>     [OracleCustomTypeMappingAttribute("MDSYS.SDO_ELEM_INFO_ARRAY")]
>     public class ElemArrayFactory : OracleArrayTypeFactoryBase<decimal> {}
>     [OracleCustomTypeMappingAttribute("MDSYS.SDO_ORDINATE_ARRAY")]
>     public class OrdinatesArrayFactory : OracleArrayTypeFactoryBase<decimal> {}
>     public override void MapFromCustomObject()
>     {
>       SetValue((int)OracleObjectColumns.SDO_GTYPE, Sdo_Gtype);
>       SetValue((int)OracleObjectColumns.SDO_SRID, Sdo_Srid);
>       SetValue((int)OracleObjectColumns.SDO_POINT, Point);
>       SetValue((int)OracleObjectColumns.SDO_ELEM_INFO, ElemArray);
>       SetValue((int)OracleObjectColumns.SDO_ORDINATES, OrdinatesArray);
>     }
>     public override void MapToCustomObject()
>     {
>       Sdo_Gtype = GetValue<decimal?>((int)OracleObjectColumns.SDO_GTYPE);
>       Sdo_Srid = GetValue<decimal?>((int)OracleObjectColumns.SDO_SRID);
>       Point = GetValue<SdoPoint>((int)OracleObjectColumns.SDO_POINT);
>       ElemArray = GetValue<decimal[]>((int)OracleObjectColumns.SDO_ELEM_INFO);
>       OrdinatesArray = GetValue<decimal[]>((int)OracleObjectColumns.SDO_ORDINATES);
>     }
>   }

This is the recomended way of reading the spatial data from over many examples I found.
I have tried to convert it to Oxygene, but got many problems. Oxidezer does not work for it.

I am using odp.net.x64.112.3.0 from Oracle (Oracle.DataAccess)

How can that be done?

Try something like:


namespace;

interface

type
  [OracleCustomTypeMappingAttribute]
  SdoGeometry = public class(OracleCustomTypeBase<SdoGeometry>)
  private
  public
    [OracleObjectMappingAttribute(0)]
    property Sdo_Gtype: Double;
    [OracleObjectMappingAttribute(1)]
    property Sdo_Srid: Double;
    [OracleObjectMappingAttribute(2)]
    property Point: SdoPoint;
    [OracleObjectMappingAttribute(3)]
    property ElemArray: array of Decimal;
    [OracleObjectMappingAttribute(4)]
    property OrdinatesArray: array of Double;
    method MapFromCustomObject; override;
    method MapToCustomObject; override;
  end;

  OracleObjectColumns nested in SdoGeometry = enum (SDO_GTYPE, SDO_SRID, SDO_POINT, SDO_ELEM_INFO, SDO_ORDINATES);

  [OracleCustomTypeMappingAttribute]
  ElemArrayFactory nested in SdoGeometry = public class(OracleArrayTypeFactoryBase<Double>)
  end;

  [OracleCustomTypeMappingAttribute]
  OrdinatesArrayFactory nested in SdoGeometry = public class(OracleArrayTypeFactoryBase<Double>)
  end;

implementation

method SdoGeometry.MapFromCustomObject;
begin
  SetValue(integer(OracleObjectColumns.SDO_GTYPE), Sdo_Gtype);
  SetValue(integer(OracleObjectColumns.SDO_SRID), Sdo_Srid);
  SetValue(integer(OracleObjectColumns.SDO_POINT), Point);
  SetValue(integer(OracleObjectColumns.SDO_ELEM_INFO), ElemArray);
  SetValue(integer(OracleObjectColumns.SDO_ORDINATES), OrdinatesArray);
end;

method SdoGeometry.MapToCustomObject;
begin
  do_Gtype := GetValue<Decimal>(integer(OracleObjectColumns.SDO_GTYPE));
  Sdo_Srid := GetValue<Decimal>(integer(OracleObjectColumns.SDO_SRID));
  Point := GetValue<SdoPoint>(integer(OracleObjectColumns.SDO_POINT));
  ElemArray := GetValue<Decimal[]>(integer(OracleObjectColumns.SDO_ELEM_INFO));
  OrdinatesArray := GetValue<Decimal[]>(integer(OracleObjectColumns.SDO_ORDINATES));
end;

I’ve logged a bug for Oxidizer.