oracle+select+自定义,c#select查询到Oracle数据库抛出“自定义类型映射...未指定或无效”...

我正试图在我的c#应用程序中映射一个简单的Oracle UDT。当我尝试从DataReader提取数据时,它会引发以下异常:

Custom type mapping for 'dataSource='DB' schemaName='C##LAZAR'

typeName='MATICNIBROJ_T'' is not specified or is invalid

Oracle 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")));

}

}数据库通讯:

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提供。虽然这些错误是我的。

有人能澄清我出错的地方吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# 访问Oracle示例+PL/SQL+存储过程+触发器 完整示例 测试可用 --PL/SQL基础1 declare begin dbms_output.('不输出不换行'); dbms_output.put_line('输出并换行'); end; --PL/SQL基础2 declare dig number(20,2); begin select avg(price) into dig from products; dbms_output.put_line('电子产品的平均价格是'||dig); end; --PL/SQL基础3 根据产品编号获得产品对象 --pname products.name%type; pname变量的类型与products.name列的类型一样 declare pid constant products.id%type:=1; --定义常量,初值1 pname products.name%type; pdate products.adddate%type; begin --pid:=1; select name,adddate into pname,pdate from products where id=pid; dbms_output.put_line('产品名称是:'||pname||',日期'||pdate); end; --PL/SQL基础4 根据产品编号获得产品对象 --obj products%rowtype; obj与products表的单行类型一样,可以通过点运算取值obj.price declare obj products%rowtype; begin select * into obj from products where id=&编号; dbms_output.put_line('产品名称是:'||obj.name||',价格:'||obj.price); end; --PL/SQL基础5 条件if declare vid products.id%type; vprice products.price%type; begin vid:=&编号; select price into vprice from products where id=vid; if vprice100 and vprice<=1000 then dbms_output.put_line('价格在100—1000之间'); else dbms_output.put_line('价格在1000以上'); end if; end; --PL/SQL基础5 多条件case begin case '&等级' when 'A' then dbms_output.put_line('优秀'); when 'B' then dbms_output.put_line('合格'); when 'C' then dbms_output.put_line('不合格'); end case; end; select id, name, typeid, price, adddate from products create table students( Id int primary key, sex int ) insert into students select 1,1 from dual union select 2,0 from dual union select 3,1 from dual union select 4,0 from dual union select 5,1 from dual insert into students(Id) values(6) select * from students; select translate(translate('1心1意 3心2意','1','一'),'3','三') from dual; select id,nvl(translate(translate(sex,1,'女'),0,'男'),'未知') from students; select id,case as 性别 from( sele

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值