c#选择对Oracle数据库的查询会引发“未指定...的自定义类型映射或无效". [英] c# select query to Oracle database throws "Custom type mapping for ... is not specified or is invalid"
问题描述
我正在尝试在我的c#应用程序中映射一个简单的Oracle UDT.当我尝试从DataReader
提取数据时,它引发以下异常:
I am trying to map a simple Oracle UDT in my c# application. When I try to extract data from DataReader
, it throws the following exception:
'dataSource ='DB'schemaName ='C ## LAZAR'的自定义类型映射 typeName ='MATICNIBROJ_T'未指定或无效
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 提供.不过,这些错误是我的. 有人可以弄清楚我出了什么问题吗?
Most of the code is provided by user LSA. The errors are mine, though. Can someone clarify where I went wrong?
推荐答案
在您的错误消息中,它说'dataSource ='DB'schemaName = 'C ## USER' typeName ='的自定义类型映射MATICNIBROJ_T''未指定或无效
In your error message it says Custom type mapping for 'dataSource='DB' schemaName='C##USER' typeName='MATICNIBROJ_T'' is not specified or is invalid
在您的自定义类型映射中,它显示[OracleCustomTypeMapping(" C ## LAZAR .MATICNIBROJ_T")]
And in your custom type mapping it says [OracleCustomTypeMapping("C##LAZAR.MATICNIBROJ_T")]
尝试调整它,然后再次运行代码.
Try adjusting it and run the code again.
这篇关于c#选择对Oracle数据库的查询会引发“未指定...的自定义类型映射或无效".的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!