Хранимые процедуры с аргументами - PullRequest
1 голос
/ 28 июня 2011

Я не могу заставить мою хранимую процедуру (SQL Server) работать с NHibernate. У меня есть следующее отображение:

<sql-query name="udp_MyStoredProc">
    <query-param name="Id" type="Int32" />
    <query-param name="Name" type="String" />
    <return-scalar column="ResId" type="Int32"/>
    EXEC udp_MyStoredProc @Id = :Id, 
        @Name = :Name    
</sql-query>

в коде:

IQuery query = _HibSession.GetNamedQuery("udp_MyStoredProc");
query.SetInt32("Id", id);
query.SetString("Name", name);
var res = query.List();

Это приводит к следующему исключению:

[SQL: EXEC udp_MyStoredProc @Id = @p0, @Name = @p1] ---> System.Data.SqlClient.SqlException: Procedure or function udp_MyStoredProc has too many arguments specified.

Я не знаю, что не так с аргументами? Я также читаю кое-что о '?' в качестве заполнителей для параметров, но я не совсем понимаю.

Подпись хранимой процедуры:

ALTER PROCEDURE [dbo].[udp_MyStoredProc]
(
    @Id int,
    @Name NVARCHAR(255)
)
AS
BEGIN  ... END

Если я делаю что-то подобное в Server Management Studio, это работает:

EXEC udp_MyStoredProc  @Id = 30, @Name = 'test'

спасибо за любые чаевые.

sl3dg3

1 Ответ

1 голос
/ 28 июня 2011

Я бы порекомендовал вам включить отладку и проверить, что это за дополнительный аргумент. Вы должны быть в состоянии увидеть, какое именно поле является проблемой. Этого может быть достаточно, чтобы посмотреть на сгенерированный SQL, или вам может потребоваться настроить log4net logger (log4net - это отладчик, который NHibernate использует внутри).

Чтобы отобразить сгенерированный SQL в консоли, добавьте (или измените) следующее свойство в файл конфигурации NHibernate в разделе фабрики сеансов:

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
  ...
  ...
  <property name="show_sql">true</property>
</session-factory>

РЕДАКТИРОВАТЬ: я могу добавить более подробную информацию о Log4Net, если вам это нужно:)

РЕДАКТИРОВАТЬ 2: Другие вещи, чтобы проверить, если вы получаете эту ошибку

  1. Ваш SP должен возвращать только одно значение
  2. Имя столбца, возвращаемого вашим SP, должно совпадать с именем столбца, определенного в вашем скалярном возвращении. Вы можете разыграть колонку, например:

    SELECT поле для возврата AS ResId

РЕДАКТИРОВАТЬ 3:

Вы можете попробовать изменить файл сопоставления на:

 <sql-query name="udp_MyStoredProc">
     <return-scalar column="ResId" type="Int32"/>
     EXEC udp_MyStoredProc: ?, ?    
 </sql-query>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...