如何在.net代碼中訪問oracle存儲過程的out參數的值 - 通過Nhibernate調用Oracle存儲過程?使用Nhibernate使用out參數的Oracle存儲過程
示例工作代碼將有所幫助。
如何在.net代碼中訪問oracle存儲過程的out參數的值 - 通過Nhibernate調用Oracle存儲過程?使用Nhibernate使用out參數的Oracle存儲過程
示例工作代碼將有所幫助。
你必須使用最新版本的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>();
,它會工作。
請參閱this comment理查德布朗。一些示例代碼可以發現here。
不幸的是我無法測試它,所以我不知道它是否有效。
我嘗試了2.1.2庫,沒有多少運氣。我不得不根據this article對庫進行一些修改。如果你走這條路線,你會想確保你使用的是Oracle.DataAccess DLL,因爲它不會與System.DataAccess.OracleClient DLL一起工作。
遲來的回覆。
對於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>
這工作!
雖然調查從NHibernate中獲取參數,我發現各種鏈接提示要獲取存儲的proc輸出參數值(而不是使用refcursor),您需要在代碼中構造命令而不是使用XML映射文件。
但我發現很難在網上找到一個完整的工作示例。這不是一個美麗的解決方案,但我發佈以防萬一有人幫助。
實例的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;
實例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;
}
我不能得到這個工作。當我下載源代碼時,我實際上不得不利用這個帖子進行一些修改(https://forum.hibernate.org/viewtopic.php?f=25&t=999056)。這也是在2.1.2版本中。 – 2010-04-09 16:06:54
當時我們並沒有爲我們的問題使用refcursor,但是,我覺得這將是我的問題的解決方案。因此,接受它。 * *請參考上面布雷克的鏈接。 – publicgk 2011-04-01 14:10:55