【问题标题】:c# select query to Oracle database throws "Custom type mapping for ... is not specified or is invalid"c# 对 Oracle 数据库的选择查询抛出“未指定 ... 的自定义类型映射或无效”
【发布时间】:2017-08-27 14:01:56
【问题描述】:

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

'dataSource='DB' schemaName='C##LAZAR' 的自定义类型映射 typeName='MATICNIBROJ_T'' 未指定或无效

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 提供。不过,错误是我的。 有人可以澄清我哪里出错了吗?

【问题讨论】:

  • 这个问题你解决了吗?如果你有,我很感兴趣......
  • 是也不是...我记得一直玩代码直到它工作,但直到今天我不知道是什么导致了错误或解决了它:) 从那时起我离开了 Oracle ,所以我真的不记得了。抱歉,我帮不上忙。

标签: c# .net oracle mapping oracle-type


【解决方案1】:

在您的错误消息中,它显示自定义类型映射为 'dataSource='DB' schemaName='C##USER' typeName='MATICNIBROJ_T'' is not specified or is invalid

在您的自定义类型映射中,它显示 [OracleCustomTypeMapping("C##LAZAR.MATICNIBROJ_T")]

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

【讨论】:

  • 这里是复制粘贴错误。代码还不错……反正不是这样的:)
  • 该死,我希望这很容易 ;-)
  • 您是否尝试过先使用MaticniBrojT mBroj = new MaticniBrojT(); 创建新对象,然后使用mBroj = (MaticniBrojT)dr.GetValue(7); 分配它?
  • 我做到了。没用...我突然想到我没有在 Oracle 对象 (MATICNIBROJ_T) 上定义任何设置器/获取器...也许这就是问题所在。回家后我会测试一下。
猜你喜欢
  • 2015-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 2019-07-15
  • 2018-08-23
  • 2014-09-08
相关资源
最近更新 更多