2013-04-05 3 views
0

Я разрабатываю приложение 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 

Идентификационный номер только для примера. Результатом этого запроса является спецификация 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); 
    } 

} 

, но когда я запускаю запрос againg, я получаю ошибку:

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

Я не могу двигаться вперед из этой ситуации из-за очень небольшого количества сопоставлений данных оракула C#. Поэтому, пожалуйста, если кто-то должен помочь, я бы очень признателен. Благодарю.

+0

Почему 'OracleObjectMappingAttribute' всегда инициализируется' 0' в вашем примере? Кажется, это отключает преобразователь типов, и атрибуты должны содержать последовательные индексы. – knittl

ответ

0

Ничего, я исправил его мной. MDSYS.VERTEX_SET_TYPE должен быть определен как простой массив Oracle, содержащий объекты VertexType.

[OracleCustomTypeMappingAttribute("MDSYS.VERTEX_SET_TYPE")] 
public class VertexSetType : OracleArrayTypeFactoryBase<VertexType> { } 
Смежные вопросы