我正在开发一个与oracle数据库一起使用的c#应用程序。我正在使用oracle.dataaccess提供程序。但是当我尝试运行此查询时:
select sdo_util.getVertices(sdo_geom.sdo_intersection(geo1,geo2,0.005))
from geotable1
where sdo_anyinteract(geo1,geo2) = 'TRUE' and id1 = 59
ID号仅作为示例。此查询的结果是每个Oracle规范MDSYS.VERTEX_SET_TYPE,它由一个VERTEX_TYPE对象表组成。
这是第一个问题。当我尝试通过oracle.dataaccess提供程序运行此查询时,我收到错误“自定义类型映射'dataSource ='...'schemaName ='MDSYS'typeName ='VERTEX_SET_TYPE''未指定或无效。我已搜索对于解决方案,它应该实现这个自定义映射,但没有成功。
所以我试图通过我实现这一点。这是代码:
[OracleCustomTypeMappingAttribute("MDSYS.VERTEX_SET_TYPE")]
public class VertexSetType : OracleCustomTypeBase<VertexSetType>
{
private enum OracleObjectColumns { VERTEX_TYPE }
private List<VertexType> vertexType;
[OracleObjectMappingAttribute(0)]
public List<VertexType> VertexType
{
get { return vertexType; }
set { vertexType = value; }
}
public override void MapFromCustomObject()
{
SetValue((int)OracleObjectColumns.VERTEX_TYPE, VertexType);
}
public override void MapToCustomObject()
{
VertexType = GetValue<List<VertexType>>((int)OracleObjectColumns.VERTEX_TYPE);
}
}
我将VertexType定义为:
[OracleCustomTypeMappingAttribute("MDSYS.VERTEX_TYPE")]
public class VertexType : OracleCustomTypeBase<VertexType>
{
private enum OracleObjectColumns { X, Y, Z, W, ID }
private decimal? x;
[OracleObjectMappingAttribute(0)]
public decimal? X
{
get { return x; }
set { x = value; }
}
private decimal? y;
[OracleObjectMappingAttribute(0)]
public decimal? Y
{
get { return y; }
set { y = value; }
}
private decimal? z;
[OracleObjectMappingAttribute(0)]
public decimal? Z
{
get { return z; }
set { z = value; }
}
private decimal? w;
[OracleObjectMappingAttribute(0)]
public decimal? W
{
get { return w; }
set { w = value; }
}
private decimal? id;
[OracleObjectMappingAttribute(0)]
public decimal? Id
{
get { return id; }
set { id = value; }
}
public override void MapFromCustomObject()
{
SetValue((int)OracleObjectColumns.X, x);
SetValue((int)OracleObjectColumns.Y, y);
SetValue((int)OracleObjectColumns.Z, z);
SetValue((int)OracleObjectColumns.W, w);
SetValue((int)OracleObjectColumns.ID, id);
}
public override void MapToCustomObject()
{
X = GetValue<decimal?>((int)OracleObjectColumns.X);
Y = GetValue<decimal?>((int)OracleObjectColumns.Y);
Z = GetValue<decimal?>((int)OracleObjectColumns.Z);
W = GetValue<decimal?>((int)OracleObjectColumns.W);
Id = GetValue<decimal?>((int)OracleObjectColumns.ID);
}
}
但是当我运行查询时,我收到错误:
无法将“spatial.VertexSetType”类型的对象强制转换为类型 'Oracle.DataAccess.Types.IOracleArrayTypeFactory'。
由于oracle数据类型的c#自定义映射非常少,所以无法从这种情况向前推进。所以,如果有人应该帮助,我会非常感激。感谢。
答案 0 :(得分:0)
没关系,我已经修好了。应将MDSYS.VERTEX_SET_TYPE定义为包含VertexType对象的简单Oracle数组。
[OracleCustomTypeMappingAttribute("MDSYS.VERTEX_SET_TYPE")]
public class VertexSetType : OracleArrayTypeFactoryBase<VertexType> { }