2011-07-27 67 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可能会帮助你了解的东西。