C# 如何在c中声明MDSYS.Sdo_几何体#

C# 如何在c中声明MDSYS.Sdo_几何体#,c#,oracle,C#,Oracle,我在Oracle数据库中有一个存储过程,它将MDSYS.Sdo_几何体和数字类型作为输入,并给出t_t_out_house_details对象和p_return_cd number PROCEDURE prc_get_impacted_houses(p_polygon_geom IN MDSYS.Sdo_Geometry, p_imkl_id IN NUMBER,

我在Oracle数据库中有一个存储过程,它将MDSYS.Sdo_几何体和数字类型作为输入,并给出t_t_out_house_details对象和p_return_cd number

PROCEDURE prc_get_impacted_houses(p_polygon_geom      IN MDSYS.Sdo_Geometry,
                                p_imkl_id        IN NUMBER,
                                p_out_house_details OUT     t_t_out_house_details,
                                p_return_cd         OUT NUMBER) IS
v_proj_dist_limit   NUMBER;
v_out_house_details t_t_out_house_details := t_t_out_house_details();
v_net_cd            VARCHAR2(6);
v_subnet_nr         NUMBER(5);
v_cable_number      NUMBER(3);
invalid_geometry EXCEPTION;
我想从C#调用这个过程,并将结果(return)显示为输出。我要声明MDSYS.Sdo_几何体数据类型。我不知道我应该声明什么类型。我试图使用空间类geomtry声明,但我不知道如何使用它。我在网上找不到这样的例子

这是我的c#代码:

有解决办法 您应该定义UDTs:MDSYS.SDO_几何体:

using System;
using System.Collections.Generic;
using System.Text;
using Oracle.DataAccess.Types;
using Oracle.DataAccess.Client;
using System.Data;

namespace some.namespace
{
  [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);
    }


    public static OracleParameter CreateSdoGeometry(string parameterName, SdoGeometry objGeometry, ParameterDirection direction = ParameterDirection.Input)
    {
        OracleParameter customParameter = new OracleParameter();

        customParameter.ParameterName = parameterName;
        customParameter.OracleDbType = OracleDbType.Object;
        customParameter.UdtTypeName = "MDSYS.SDO_GEOMETRY";
        customParameter.Direction = direction;
        customParameter.Value = objGeometry; 

        return customParameter;
    }
  }
}
使用系统;
使用System.Collections.Generic;
使用系统文本;
使用Oracle.DataAccess.Types;
使用Oracle.DataAccess.Client;
使用系统数据;
namespace.namespace
{
[OracleCustomTypeMappingAttribute(“MDSYS.SDO_几何体”)]
公共类SDogometry:OracleCustomTypeBase
{
私有枚举OracleObjectColumns{SDO_GTYPE、SDO_SRID、SDO_POINT、SDO_ELEM_INFO、SDO_ORDINATES}
私有十进制?SDOgtype;
[OracleObjectMappingAttribute(0)]
公共十进制?SDOgtype
{
获取{return sdo_Gtype;}
设置{sdo_Gtype=value;}
}
私有十进制?sdo_Srid;
[OracleObjectMappingAttribute(1)]
公共十进制?Sdo_Srid
{
获取{return sdo_Srid;}
设置{sdo_Srid=value;}
}
私人点;
[OracleObjectMappingAttribute(2)]
公共点
{
获取{返回点;}
设置{point=value;}
}
私人玛丽酒店;
[OracleObjectMappingAttribute(3)]
公共玛丽酒店
{
获取{return elemArray;}
设置{elemaray=value;}
}
私有十进制数组;
[OracleObjectMappingAttribute(4)]
公共十进制数组
{
获取{return sarray;}
设置{坐标数组=值;}
}
[OracleCustomTypeMappingAttribute(“MDSYS.SDO\u ELEM\u INFO\u数组”)]
公共类ElemArrayFactory:OracleArrayTypeFactoryBase{}
[OracleCustomTypeMappingAttribute(“MDSYS.SDO_坐标_数组”)]
公共类OraclearRayFactory:OracleArrayTypeFactoryBase{}
公共覆盖无效MapFromCustomObject()
{
SetValue((int)OracleObjectColumns.SDO_GTYPE,SDO_GTYPE);
SetValue((int)OracleObjectColumns.SDO_SRID,SDO_SRID);
SetValue((int)OracleObjectColumns.SDO_点,点);
SetValue((int)OracleObjectColumns.SDO_ELEM_INFO,elemaray);
SetValue((int)OracleObjectColumns.SDO_坐标,坐标数组);
}
公共覆盖无效MapToCustomObject()
{
Sdo_Gtype=GetValue((int)OracleObjectColumns.Sdo_Gtype);
Sdo_Srid=GetValue((int)OracleObjectColumns.Sdo_Srid);
Point=GetValue((int)OracleObjectColumns.SDO_Point);
ElemArray=GetValue((int)OracleObjectColumns.SDO_ELEM_INFO);
Orderationsarray=GetValue((int)OracleObjectColumns.SDO_坐标);
}
公共静态OracleParameter CreateSdoGeometry(字符串参数名称,SdoGeometry对象几何,参数方向=参数方向.Input)
{
OracleParameter customParameter=新的OracleParameter();
customParameter.ParameterName=ParameterName;
customParameter.OracleDbType=OracleDbType.Object;
customParameter.UdtTypeName=“MDSYS.SDO_几何体”;
自定义参数。方向=方向;
customParameter.Value=物体几何;
返回自定义参数;
}
}
}
和MDSYS.SDO_点_类型:

using System;
using System.Collections.Generic;
using System.Text;
using Oracle.DataAccess.Types;

namespace some.namespace
{
  [OracleCustomTypeMappingAttribute("MDSYS.SDO_POINT_TYPE")]
  public class SdoPoint : OracleCustomTypeBase<SdoPoint>
  {
    private decimal? x;

    [OracleObjectMappingAttribute("X")]
    public decimal? X
    {
      get { return x; }
      set { x = value; }
    }

    private decimal? y;

    [OracleObjectMappingAttribute("Y")]
    public decimal? Y
    {
      get { return y; }
      set { y = value; }
    }

    private decimal? z;

    [OracleObjectMappingAttribute("Z")]
    public decimal? Z
    {
      get { return z; }
      set { z = value; }
    }

    public override void MapFromCustomObject()
    {
      SetValue("X", x);
      SetValue("Y", y);
      SetValue("Z", z);
    }

    public override void MapToCustomObject()
    {
      X = GetValue<decimal?>("X");
      Y = GetValue<decimal?>("Y");
      Z = GetValue<decimal?>("Z");
    }
  }
}
使用系统;
使用System.Collections.Generic;
使用系统文本;
使用Oracle.DataAccess.Types;
namespace.namespace
{
[OracleCustomTypeMappingAttribute(“MDSYS.SDO\u POINT\u TYPE”)]
公共类SdoPoint:OracleCustomTypeBase
{
私有十进制?x;
[OracleObjectMappingAttribute(“X”)]
公共十进制?X
{
获取{return x;}
设置{x=value;}
}
私有十进制?y;
[OracleObjectMappingAttribute(“Y”)]
公共十进制
{
获取{返回y;}
设置{y=value;}
}
私有十进制?z;
[OracleObjectMappingAttribute(“Z”)]
公共十进制?Z
{
获取{return z;}
设置{z=value;}
}
公共覆盖无效MapFromCustomObject()
{
设定值(“X”,X);
设定值(“Y”,Y);
设定值(“Z”,Z);
}
公共覆盖无效MapToCustomObject()
{
X=获取值(“X”);
Y=获取值(“Y”);
Z=获取值(“Z”);
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using Oracle.DataAccess.Types;

namespace some.namespace
{
  [OracleCustomTypeMappingAttribute("MDSYS.SDO_POINT_TYPE")]
  public class SdoPoint : OracleCustomTypeBase<SdoPoint>
  {
    private decimal? x;

    [OracleObjectMappingAttribute("X")]
    public decimal? X
    {
      get { return x; }
      set { x = value; }
    }

    private decimal? y;

    [OracleObjectMappingAttribute("Y")]
    public decimal? Y
    {
      get { return y; }
      set { y = value; }
    }

    private decimal? z;

    [OracleObjectMappingAttribute("Z")]
    public decimal? Z
    {
      get { return z; }
      set { z = value; }
    }

    public override void MapFromCustomObject()
    {
      SetValue("X", x);
      SetValue("Y", y);
      SetValue("Z", z);
    }

    public override void MapToCustomObject()
    {
      X = GetValue<decimal?>("X");
      Y = GetValue<decimal?>("Y");
      Z = GetValue<decimal?>("Z");
    }
  }
}