2017-04-02 2 views
0

C#アプリケーションで単純なOracle UDTをマップしようとしています。私はDataReaderからデータを抽出しようとすると、それは次の例外がスローされます:「データソース=」DB「SCHEMANAME = 『C## LAZAR』 型名= 『MATICNIBROJ_T』は」を指定したりでされていないためc#select query to Oracle database throw "カスタム・タイプ・マッピングが指定されていないか無効です"

カスタム型マッピング無効

の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"))); 
     } 
    } 

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』型名= 『MATICNIBROJ_T』は」を指定、または無効

そして、あなたのカスタムタイプであるされていないため、カスタム型マッピング語りますマッピングすると[OracleCustomTypeMapping( "C## LAZAR .MATICNIBROJ_T")]

調整してもう一度コードを実行してください。

+0

ここではコピー・ペースト・エラーです。コードは悪くない...とにかくそうではありません:) – dzenesiz

+1

くそ、私はそれが簡単だと思っていました;-) – LSA

+1

MaticniBrojT mBroj = new MaticniBrojT();を使って最初に新しいオブジェクトを作成してみましたか?それは 'mBroj =(MaticniBrojT)dr.GetValue(7);を使用しています; – LSA

関連する問題