C# 使用nHibernate调用Oracle存储过程
我在Oracle中有一个存储过程:C# 使用nHibernate调用Oracle存储过程,c#,.net,nhibernate,stored-procedures,C#,.net,Nhibernate,Stored Procedures,我在Oracle中有一个存储过程: procedure Test(results OUT gencursor, id in number) is v_cursor gencursor; begin OPEN v_cursor FOR select id, name, age from tblcustomers s where s.id = id; results:=v_cursor; end Test; 现在,我想使用nHibernateISession.CreateS
procedure Test(results OUT gencursor, id in number) is
v_cursor gencursor;
begin
OPEN v_cursor FOR
select id, name, age from tblcustomers s where s.id = id;
results:=v_cursor;
end Test;
现在,我想使用nHibernateISession.CreateSQLQuery
执行这个过程。到目前为止,我看到的所有示例都使用ISession.GetNamedQuery()
因此,我想做一些类似的事情(ToDataTable
是我自己在IQuery
上的扩展方法,我有更多的扩展方法,我希望与存储过程结合使用):
上面的代码引发以下异常:
“无法执行查询[调用]
MyPackage.Test(?)名称:id-值:33
[SQL:调用MyPackage.Test(?)”
我也试过:
var result = session
.CreateSQLQuery("call MyPackage.Test(:result, :id)")
.SetDecimal("id", 33)
.ToDataTable();
那一个抛出异常:
并非所有命名参数都已命名
set:[result][call MyPackage.Test(:result,
:id)]
我现在不知道您是否可以从CreateSQLQuery调用sps,但我将向您展示如何在当前项目中从NHibernate调用Oracle sps:
var query = _session.GetNamedQuery("MyPackageTestSp");
query.SetParameter("id", 33);
query.ExecuteUpdate();
在映射文件中,命名查询的定义如下:
<sql-query name="MyPackageTestSp">
call MyPackage.Test(:result, :id)
</sql-query>
调用MyPackage.Test(:result,:id)
工作起来很有魅力:-)我发现只使用视图更容易。在映射中,只需在类上设置mutable=false,这样它就不能被更新。视图应该创建您试图实现的抽象级别。我想我更难将输出光标映射到nHibernate。您的方法如何处理输出结果?我在手册中读到,要求是输出应该在第一个参数中(作为游标)。这个答案对我来说非常有用,但我注意到了两件事:看起来Martin在sql查询节点中放置了两次“调用”。我只需要一个就可以让它工作了。另外,请确保在call xxx(…)语句后不要留下尾随分号。我打电话给xxx(…);我花了好几个小时才弄明白甲骨文向我吐出的胡说八道的错误信息。希望这有帮助。
<sql-query name="MyPackageTestSp">
call MyPackage.Test(:result, :id)
</sql-query>