Подтвердить что ты не робот

Как вызвать хранимую процедуру из NHibernate, которая не имеет результата?

У меня есть хранимая процедура, которая регистрирует некоторые данные, как я могу назвать это с помощью NHibernate?

До сих пор я:

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

Каким должен быть метод ?????? Или делаете что-то более принципиально неправильно?

4b9b3361

Ответ 1

Это, по-видимому, ограничение NHibernate, от NHibernate Documentation:

Процедура должна возвращать набор результатов. NHibernate будет использовать IDbCommand.ExecuteReader() для получения результатов.

Ответ 2

ExecuteUpdate на SQL Query должен помочь вам.

Пример:

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

Ответ 3

NHibernate позволяет выполнять объектно-ориентированное программирование и заботится об извлечении объектов и сохранении объектов в базе данных за кулисами.

NHibernate не предоставляет вам простой API для простого выполнения хранимых процедур, поскольку это, похоже, не имеет особого отношения к объектно-ориентированному программированию, будь то выбор объектов или их сохранение.

Итак, вы делаете что-то принципиально неправильное в попытке использовать NHibernate непосредственно для выполнения высоко процедурного кода. Если вы хотите использовать NHibernate, вы должны сказать ему, как выполнение этой хранимой процедуры за кулисами волшебным образом поможет с извлечением объектов и сохранением объектов в базе данных.

Вы можете:

  • Используйте ADO.NET напрямую, открывая новый IDbConnection или получая соединение ISession, создавая IDbCommand и т.д. Сделайте это, если вам нужен разовый подход к выполнению хранимых процедур.
  • Создайте прослушиватель NHibernate и настройте его в Configuration, чтобы выполнить эту хранимую процедуру, когда некоторые другие события отправляются по конвейеру NHibernate. Выполняйте это только в том случае, если эта хранимая процедура должна выполняться каждый раз и только тогда, когда происходят эти события.

Ответ 4

Вы можете использовать UniqueResult для выполнения хранимого процесса, который ничего не возвращает. Я использую следующее для вызова сохраненного proc, который либо вставляет, либо обновляет запись, чтобы отслеживать пользователей, которые в настоящее время вошли на наш сайт 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

В общем случае вызов процедуры, выполняющей некоторые другие задачи, и возвращение набора результатов в конце, не отличается от запроса SELECT. Поэтому в ответах выше, при выполнении запроса на последнем шаге вам нужно позвонить

query.List<T>();

где T - объект POCO, определенный в вашем коде.

Ответ 6

Сохраненная процедура должна возвращать набор результатов. Первым параметром процедуры должен быть OUT, который возвращает набор результатов. Это делается с использованием типа SYS_REFCURSOR в Oracle 9i или более поздней версии. Даже если вы не хотите возвращать какой-либо результирующий набор, вы должны объявить первый параметр в хранимой процедуре как CURSOR_NAME OUT SYS_REFCURSOR.

Ответ 7

Выполните следующие решения:

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