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

时间:2009-07-07 10:21:24

标签: c# nhibernate stored-procedures

我有一个记录一些数据的存储过程,如何用NHibernate调用它?

到目前为止,我有:

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

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

7 个答案:

答案 0 :(得分:53)

SQL Query上的ExecuteUpdate可以帮助你。

<强>示例:

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

答案 1 :(得分:14)

这似乎是NHibernate的限制,来自NHibernate Documentation

  

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

答案 2 :(得分:12)

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

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

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

你可以:

  • 直接使用ADO.NET,打开新的IDbConnection或获取ISession的连接,创建IDbCommand等。如果您需要一次性方法,请执行此操作执行存储过程。
  • 创建一个NHibernate监听器并在Configuration中配置它,以便在通过NHibernate管道发送某些其他事件时执行此存储过程。只有在每次实际执行此存储过程且仅在发生这些事件时才执行此操作。

答案 3 :(得分:9)

您可以使用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();

答案 4 :(得分:0)

通常,调用执行其他一些杂务并在结尾处返回结果集的过程与进行SELECT查询没有什么不同。因此,在上面的答案中,当您在最后一步执行查询时,您需要调用

query.List<T>();

其中T是您的代码中定义的POCO对象。

答案 5 :(得分:0)

请执行以下解决方案:

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();
        }

答案 6 :(得分:-1)

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

相关问题