2014-09-22 6 views
0

Я не могу заставить этот вызов хранимой процедуры работать. Я постоянно получаю «Дополнительная информация: Параметр UserName не существует в качестве имени параметра в [LockUser]» сообщениеВызов хранимой процедуры с использованием NHibernate

using (var session = sm.OpenSession())   
{ 
    var query = session.CreateSQLQuery("LockUser") 
    .SetString("UserName", User.UserName.ToString());     
} 

отображение

<?xml version="1.0" encoding="utf-8" ?>              <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
namespace="Models.Mappings" assembly="Intranet"> 
<sql-query name="LockUser"> 
    <property name="UserName"/> 
    exec LockUser :UserName 
</sql-query> 

может кто-нибудь мне точку в правильном направлении ?

+0

Их опечатка в вашем сопоставлении, я предполагаю, что это не полное отображение ... И ваш СП возвратит что-нибудь? – Rippo

+0

Это для SQL Server или Oracle? – DavidG

+0

@DavidG sql server – hikizume

ответ

2

Вы смешиваете две функции.

17.2. Named SQL queries

небольшой цитируется фрагмент:

<sql-query name="persons"> 
    <return alias="person" class="eg.Person"/> 
    SELECT person.NAME AS {person.Name}, 
      person.AGE AS {person.Age}, 
      person.SEX AS {person.Sex} 
    FROM PERSON person 
    WHERE person.NAME LIKE :namePattern 
</sql-query> 

использование:

IList people = sess.GetNamedQuery("persons") 
    .SetString("namePattern", namePattern) 
    .SetMaxResults(50) 
    .List(); 

Итак, как мы можем видеть, что должно быть назвать GetNamedQuery()

Или вы можете использовать

Chapter 17. Native SQL

небольшой цитируется фрагмент:

sess.CreateSQLQuery("SELECT ID, NAME, BIRTHDATE, DOG_ID FROM CATS") 
    .AddEntity(typeof(Cat)); 

Резюме: для именованных запросов, мы должны использовать .GetNamedQuery(). Мы также можем использовать .CreateSQLQuery() для создания SQL. Проверьте также это для рабочего примера: Nhibernate CreateSQLQuery Stored Procedure result to non mapped class

+0

Я получаю то, что вы говорите, но я не ближе к его достижению. Мне нужно использовать именованный запрос, как вы упомянули, но для обновления. Я смог найти множество примеров для выбора, но не для обновлений. – hikizume

+0

1) введите свой именованный запрос через 'GetNamedQuery()' 2), заполните параметры с помощью '.SetString()' или '.SetParameter()' 3), вызывайте ** 'ExecuteUpdate()' ** Это должно работать. Существенным здесь является ExecuteUpdate ... что делает трюк в сравнении с тем, что вы видели - SELECT –

+0

Нет сигары. Если я изменил его на GetNamedQuery, ошибка изменится на именованный запрос неизвестным – hikizume

Смежные вопросы