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

tha*_*att 31 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.?????;
Run Code Online (Sandbox Code Playgroud)

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

Sat*_*aga 54

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();
Run Code Online (Sandbox Code Playgroud)


tha*_*att 15

这似乎是NHibernate的限制,来自NHibernate文档:

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

  • 我不会称之为"限制",更像是"按设计". (5认同)

yfe*_*lum 12

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

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

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

您可以:

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


Pet*_*son 10

您可以使用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();
Run Code Online (Sandbox Code Playgroud)