代码之家  ›  专栏  ›  技术社区  ›  thatismatt

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

  •  31
  • thatismatt  · 技术社区  · 17 年前

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

    到目前为止,我已经:

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

    该怎么办 ????? 是还是我在做一些根本错误的事情?

    7 回复  |  直到 12 年前
        1
  •  56
  •   Jesse MacVicar    14 年前

    SQL查询的ExecuteUpdate应该对您有所帮助。

    ISession session = ....
    IQuery query = session.CreateSQLQuery("exec LogData @Time=:time, @Data=:data");
    query.SetDateTime("time", time);
    query.SetString("data", data);
    query.ExecuteUpdate();
    
        2
  •  15
  •   Gonzalo.-    10 年前

    这似乎是NHibernate的一个限制,从 NHibernate Documentation :

        3
  •  12
  •   yfeldblum    17 年前

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

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

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

    你可以:

    • 直接使用ADO.NET,打开一个新的 IDbConnection 或者得到 ISession 的连接,创建一个 IDbCommand
    • 创建一个NHibernate侦听器并在 Configuration ,以在通过NHibernate管道发送某些其他事件时执行此存储过程。只有在每次实际执行此存储过程并且仅当这些事件发生时,才执行此操作。
        4
  •  10
  •   Pete Nelson    15 年前

    可以使用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();
    
        5
  •  0
  •   katrash    10 年前

    通常,调用一个执行其他一些杂务的过程并在最后返回一个结果集与生成一个 SELECT 查询因此,在上面的答案中,当执行最后一步中的查询时,您需要调用

    query.List<T>();

    哪里 T

        6
  •  0
  •   Ankush Band    10 年前

    请执行以下解决方案:

    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();
            }
    
        7
  •  -2
  •   Mayur Pawar    10 年前

    存储过程必须返回结果集。过程的第一个参数必须是返回结果集的OUT。这是通过在Oracle 9i或更高版本中使用SYS_REFCURSOR类型来完成的。 .