2011-07-27 66 views
1

我也無法通過ref_cursor從存儲過程獲取數據。 也許你可以建議你是怎麼解決這個問題 -NHibernate從存儲過程通過ref_cursor獲取數據

我的錯誤: 「ORA-06553:PLS-306:錯號碼或類型的呼叫‘GET_SAMPLE_LIST’參數」} 我想的不同類型的參數在通話的問題

這裏是我的代碼:

HBM

<?xml version="1.0" encoding="utf-8" ?> 
<!-- Generated by MoreGen 28-Apr-2008 11:27:28 --> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Infra" 
       namespace="Infra.Entities"> 

<class name="Sample" table="MY_PACK.Get_Sample_List" lazy="true"> 
<id name="Id" column="ID"> 
    <generator class="native" /> 
</id> 
<property name="Makat8" column="makat8" /> 
<property name="SerialNumber" column="serial_number" /> 

<loader query-ref="MY_PACK.Get_Sample_List"/> 
</class> 
<sql-query name="MY_PACK.Get_Sample_List" callable="true" > 
<query-param name="p_crs" type="OracleDbType.RefCursor" /> 
<query-param name="p_1" type="int" /> 
<query-param name="p_2" type="string" /> 
<query-param name="p_3" type="int" /> 
<query-param name="p_4" type="date" /> 
<query-param name="p_5" type="date" /> 
<return alias="MY_PACK.Get_Sample_List" class="Sample"> 
    <return-property name="Makat8" column="makat8" /> 
    <return-property name="SerialNumber" column="serial_number" /> 

</return> 
call MY_PACK.Get_Sample_List (:p_crs, :p_1 , :p_2 , :p_3 , :p_4 , :p_5) 


</sql-query> 
</hibernate-mapping> 

樣品實體:

public class Sample 
{ 
    public virtual int Id { get; set; } 
    public virtual int Makat8 { get; set; } 
    public virtual int SerialNumber { get; set; } 
} 

會話配置 - 這是流利,但還是那句話:

 m_Factory = Fluently.Configure() //cfgRules 
       .Database(OracleClientConfiguration.Oracle10.Dialect("NHibernate.Dialect.Oracle10gDialect") 
      .ConnectionString(x => x.FromConnectionStringWithKey("MyDBCONNSTRING")) 
      .Driver<NHibernate.Driver.OracleDataClientDriver>().ShowSql()) 
      .ExposeConfiguration(c => c.Properties.Add("hbm2ddl.keywords", "none")) 
      .Mappings(m => 
      { 
       m.FluentMappings.AddFromAssemblyOf<MyEntityMapping>(); 
       m.HbmMappings.AddFromAssemblyOf<MyHBMMapping>(); 
       m.MergeMappings(); 
      }) 
      .BuildConfiguration() 
      .BuildSessionFactory(); 

有測試:

using (ISession Session = NHibernateSessionProvider.GetSession("MyDBCONNSTRING")) 
     { 
      using (NHibernate.ITransaction Tran = Session.BeginTransaction(System.Data.IsolationLevel.Serializable)) 
      { 
       IQuery query = (IQuery)Session.GetNamedQuery("MY_PACK.Get_Sample_List").SetResultTransformer(Transformers.AliasToBean(typeof(Sample))); ; 



       query.SetParameter("p_crs", OracleDbType.RefCursor); 
       query.SetParameter("p_1", 1); 
       query.SetParameter("p_2", 12345678); 
       query.SetParameter("p_3", 1); 
       query.SetDateTime("p_4", null); 
       query.SetDateTime("p_5", null); 




       IList result = query.List(); 

      } 
     } 

任何幫助將appreceated!

回答

1

自從我使用NHibernate和Oracle以來已經有一段時間了,但我似乎記得一些事實,即它不工作,除非ref_cursor存儲過程參數的名稱是特定值(嘗試一起使用Google這些行),並且是proc的第一個參數(和你的一樣)。

+1

你是什麼意思 - ref_cursor存儲過程參數的名稱是一個特定的值? –

0

REF CURSOR必須在你的程序中的第一個參數(pCursor OUT ReferenceCursor):

包體

PROCEDURE usp_GetDual 
    (
      pCursor OUT ReferenceCursor, 
      a IN CHAR, 
      b IN CHAR 
    ) 

    IS 

    err_code NUMBER; 
    err_msg VARCHAR2(200); 

    BEGIN 

    OPEN pCursor FOR 
    SELECT * FROM dual; 

    EXCEPTION 
    WHEN OTHERS THEN 
     err_code := SQLCODE; 
     err_msg := substr(SQLERRM, 1, 200); 

END usp_GetDual; 

你的映射XML:

<?xml version="1.0" encoding="utf-8"?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="MyAssembly"> 
    <sql-query name="GetDaul"> 
     { call MYPACKAGE.usp_GetDual (:a, :b) } 
    </sql-query> 
</hibernate-mapping> 

現在,你可以簡單地查詢使用這個:

var value = Session.GetNamedQuery("GetDaul") 
    .SetParameter<string>("a", "AAA") 
    .SetParameter<string>("b", "BBB") 
    .UniqueResult(); 

你可以找到更好的解釋here

article可能會幫助你瞭解的東西。