2013-04-05 47 views
0

我正在開發一個與oracle數據庫一起工作的c#應用程序。我正在使用oracle.dataaccess提供程序。但是當我嘗試運行此查詢:oracle mdsys.vertex_set_type自定義映射c#

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提供程序運行此查詢時,出現錯誤「數據源的默認類型映射='...'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); 
    } 

} 

但當我運行查詢againg,我得到的錯誤:

Unable to cast object of type 'spatial.VertexSetType' to type 'Oracle.DataAccess.Types.IOracleArrayTypeFactory'.

我不能從這種情況下前進,因爲Oracle的數據類型非常少的C#自定義映射關係的。所以,請,如果有人要幫忙,我真的很感激它。謝謝。

+0

爲什麼在您的示例中'OracleObjectMappingAttribute'總是用'0'初始化?這似乎是類型轉換器,屬性應該包含順序索引。 – knittl 2015-09-16 11:18:32

回答

0

沒關係,我已經修好了我。應將MDSYS.VERTEX_SET_TYPE定義爲包含VertexType對象的簡單Oracle數組。

[OracleCustomTypeMappingAttribute("MDSYS.VERTEX_SET_TYPE")] 
public class VertexSetType : OracleArrayTypeFactoryBase<VertexType> { }