2009-11-26 217 views

回答

1

你必须使用最新版本的NHibernate(2.1.2)。

<sql-query name="ReturnSomethig" callable="true"> 
    <return class="Somethig" /> 
    { call ReturnSomethig(:someParameter) } 
</sql-query> 

Oracle存储过程需要具有第一个参数作为out sys_refcursor参数。

你可以叫这样的命名查询:

IQuery query = currentSession.GetNamedQuery("ReturnSomethig"); 
query.SetInt64("someParameter", someParameter); 
var somethig = query.List<Somethig>(); 

,它会工作。

+0

我不能得到这个工作。当我下载源代码时,我实际上不得不利用这个帖子进行一些修改(https://forum.hibernate.org/viewtopic.php?f=25&t=999056)。这也是在2.1.2版本中。 – 2010-04-09 16:06:54

+0

当时我们并没有为我们的问题使用refcursor,但是,我觉得这将是我的问题的解决方案。因此,接受它。 * *请参考上面布雷克的链接。 – publicgk 2011-04-01 14:10:55

0

请参阅this comment理查德布朗。一些示例代码可以发现here
不幸的是我无法测试它,所以我不知道它是否有效。

1

我尝试了2.1.2库,没有多少运气。我不得不根据this article对库进行一些修改。如果你走这条路线,你会想确保你使用的是Oracle.DataAccess DLL,因为它不会与System.DataAccess.OracleClient DLL一起工作。

0

迟来的回复。

对于oracle,out参数不受nHibernate支持,除非它是一个游标。如果你只是想要一个标量值,解决方法是用oracle函数包装你的存储过程。

然后你就可以做到这一点

<sql-query name="TestOracleFunction" callable="true"> 
    <return-scalar column="MyOutputValue" type="String" /> 
    <![CDATA[ 
    select MyOracleFunction as MyOutputValue from dual 
    ]]> 
    </sql-query> 

这工作!

0

虽然调查从NHibernate中获取参数,我发现各种链接提示要获取存储的proc输出参数值(而不是使用refcursor),您需要在代码中构造命令而不是使用XML映射文件。

但我发现很难在网上找到一个完整的工作示例。这不是一个美丽的解决方案,但我发布以防万一有人帮助。

  1. 实例的Oracle存储过程:

    create or replace PACKAGE BODY MY_PACKAGE AS 
    
        PROCEDURE add_one 
        (
        p_out out number, 
        p_in in number 
    ) AS 
        BEGIN 
        select p_in + 1 into p_out from dual; 
        END add_one; 
    
    END MY_PACKAGE; 
    
  2. 实例C#代码,其中sessionFactory是NHibernate的ISessionFactory

    using (var session = sessionFactory.OpenSession()) 
    using (var transaction = session.BeginTransaction()) 
    { 
        var command = session.Connection.CreateCommand(); 
        command.CommandType = CommandType.StoredProcedure; 
        command.CommandText = "MY_PACKAGE.add_one"; 
    
        var parmOut = command.CreateParameter(); 
        parmOut.ParameterName = "p_out"; 
        parmOut.DbType = DbType.Decimal; 
        parmOut.Direction = ParameterDirection.Output; 
        command.Parameters.Add(parmOut); 
    
        var parmIn = command.CreateParameter(); 
        parmIn.ParameterName = "p_in"; 
        parmIn.DbType = DbType.Decimal; 
        parmIn.Direction = ParameterDirection.Input; 
        parmIn.Value = 67; 
        command.Parameters.Add(parmIn); 
    
        transaction.Enlist(command); 
        command.ExecuteNonQuery(); 
    
        int sixtyEight = (int) (decimal) parmOut.Value; 
    } 
    
相关问题