如何从NHibernate调用没有结果的存储过程?

问题描述:

我有一个存储过程,记录一些数据,我怎么可以用NHibernate调用这个?如何从NHibernate调用没有结果的存储过程?

到目前为止,我有:

ISession session = .... 
IQuery query = session.CreateQuery("exec LogData @Time=:time @Data=:data"); 
query.SetDateTime("time", time); 
query.SetString("data", data); 
query.?????; 

应该采取什么方法?????是什么?或者我正在做一些更根本性的错误?

这似乎是NHibernate的的限制,从NHibernate Documentation

过程必须返回一个结果集。 NHibernate将使用IDbCommand.ExecuteReader()来获得结果。

+4

我不会称之为“限制”,更像是“设计”。 – mxmissile 2009-07-07 19:47:16

NHibernate允许您执行面向对象的编程,并负责从后台获取对象并将对象保存到数据库。

NHibernate没有为您提供简单的执行存储过程的简单API,因为这似乎与面向对象编程无关,无论是获取对象还是保存对象。

所以你在尝试直接使用NHibernate执行高度过程代码时做了一些根本性的错误。如果你想使用NHibernate,你必须告诉它如何在幕后执行这个存储过程神奇地帮助从数据库中获取对象并将对象保存到数据库。

您可以:直接

  • 使用ADO.NET,打开一个新的IDbConnection或获取ISession的连接,创建一个IDbCommand等做,如果你需要一个一次性的方法来执行存储程序。
  • 创建一个NHibernate侦听器,并在Configuration中配置它,以在通过NHibernate管道发送某些其他事件时执行此存储过程。只有当这个存储过程每次都应该被执行并且只有在这些事件发生时才会执行。

SQL查询上的ExecuteUpdate应该可以帮到你。

样品:

ISession session = .... 
IQuery query = session.CreateSQLQuery("exec LogData @Time=:time, @Data=:data"); 
query.SetDateTime("time", time); 
query.SetString("data", data); 
query.ExecuteUpdate(); 
+0

我应该如何获得回报值? – nicks 2015-10-27 07:35:23

您可以使用UniqueResult执行一个存储过程,不返回任何东西。我使用以下命令调用一个存储过程,该过程插入或更新记录以跟踪当前登录到ASP.NET MVC站点的用户。

IQuery query = session.GetNamedQuery("UserSession_Save"); 
query.SetInt32("UserID", userID); 
query.SetString("CookieID", cookieID); 
query.SetString("Controller", controller); 
query.SetString("Action", action); 

query.UniqueResult(); 
+0

谢谢,当`ExecuteUpdate`没有。 – Schmalls 2011-12-21 16:35:51

一般情况下,调用,做一些其他的家务,并返回设定在最后结果的过程是不是比发出SELECT查询不同。因此,上述问题的答案,在最后一步执行查询时需要调用

query.List<T>();

其中T是在你的代码中定义一个POCO对象。

存储过程必须返回结果集。过程的第一个参数必须是一个返回结果集的OUT。这是通过在Oracle 9i或更高版本中使用SYS_REFCURSOR类型来完成的。 即使您不想返回任何结果集,您也必须在存储过程中声明第一个参数为CURSOR_NAME OUT SYS_REFCURSOR

待办事项以下解决方案:

public void Test(TestEntity TestEntity) 
     {   
    IQuery query = NHSession.CreateSQLQuery("exec LogData :Time, :Data"); 
      query.SetParameter("Time", TestEntity.Time); 
      query.SetParameter("Data", TestEntity.Data); 
      object obj = query.UniqueResult(); 
     }