2017-04-02 85 views
0

我想映射一个简单的Oracle UDT在我的c#应用程序中。当尝试从DataReader提取数据,它引发以下例外:c#选择查询到Oracle数据库抛出“自定义类型映射...未指定或无效”

关于“的dataSource =” DB“SCHEMANAME =‘自定义类型映射Ç## LAZAR’ 的typeName =‘MATICNIBROJ_T’”未指定或是无效

甲骨文UDT是:

create or replace 
TYPE   "MATICNIBROJ_T" AS OBJECT (
    MaticniBroj NUMBER(13) 
) 
INSTANTIABLE NOT FINAL 

自定义类用于作图:

[OracleCustomTypeMapping("C##LAZAR.MATICNIBROJ_T")] 
public class MaticniBrojT : IOracleCustomType 
    { 
     [OracleObjectMappingAttribute("MaticniBroj")] 
     public virtual int MaticniBroj { get; set; } 

     //c# custom type --> Oracle UDT 
     public virtual void FromCustomObject(OracleConnection conn, IntPtr obj) 
     { 
      OracleUdt.SetValue(conn, obj, "MaticniBroj", this.MaticniBroj); 
     } 

     //Oracle UDT --> c# custom type 
     public virtual void ToCustomObject(OracleConnection conn, IntPtr obj) 
     { 
      this.MaticniBroj = ((int)(OracleUdt.GetValue(conn, obj, "MaticniBroj"))); 
     } 
    } 

DB通信

string upit = @"SELECT PIB, NAZIV, RACUN, FAX, TELEFON, ADRESA, EMAIL, 
    MATICNIBR FROM KOMITENT_VW k WHERE UPPER(NAZIV) LIKE '%" + naziv.ToUpper() + "%'"; 

        conn = napraviKonekciju(); 

        conn.Open(); 

       OracleCommand cmd = new OracleCommand(); 

       cmd.Connection = conn; 

       cmd.CommandText = upit; 
       cmd.CommandType = CommandType.Text; 

       OracleDataReader dr = cmd.ExecuteReader(); 

       DataSet ds = new DataSet(); 
       DataTable dt = new DataTable(); 

       dt.Columns.Add("PIB"); 
       dt.Columns.Add("NAZIV"); 
       dt.Columns.Add("RACUN"); 
       dt.Columns.Add("FAX"); 
       dt.Columns.Add("TELEFON"); 
       dt.Columns.Add("ADRESA"); 
       dt.Columns.Add("EMAIL"); 
       dt.Columns.Add("MATICNIBR"); 
       ds.Tables.Add(dt); 

       while(dr.Read()) 
       { 
        DataRow red = dt.NewRow(); 
        red["PIB"] = dr.GetInt32(0); 
        red["NAZIV"] = dr.GetString(1); 
        red["RACUN"] = dr.GetString(2); 
        red["FAX"] = dr.GetString(3); 
        red["TELEFON"] = dr.GetString(4); 
        red["ADRESA"] = dr.GetString(5); 
        red["EMAIL"] = dr.GetString(6); 
        //----next line throws an exception 
        MaticniBrojT mBroj = (MaticniBrojT)dr.GetValue(7); 

        red["MATICNIBR"] = Convert.ToInt64(mBroj.MaticniBroj); 
       } 

       return ds; 
      } 
      catch (Exception ex) 
      { 
       return null; 
      } 
      finally 
      { 
       conn.Close(); 
       conn.Dispose(); 
       conn = null; 
      } 

大部分代码是由用户提供LSA。虽然这些错误是我的。 有人可以澄清我哪里错了吗?

回答

1

在您的错误信息,它说的自定义类型映射“数据源=” DB“SCHEMANAME = ‘C## USER’的typeName =‘MATICNIBROJ_T’”未指定或无效

而在你的自定义类型它映射它说:[OracleCustomTypeMapping(“C## LAARAR .MATICNIBROJ_T”)]

尝试调整它并再次运行代码。

+0

这是一个复制粘贴错误在这里。代码是不错的...不,不管怎么样:) – dzenesiz

+1

该死的,我希望是那么容易;-) – LSA

+1

您是否尝试过使用MaticniBrojT mBroj = new MaticniBrojT();创建新对象,然后分配它使用'mBroj =(MaticniBrojT)dr.GetValue(7);'? – LSA