带参数的存储过程

时间:2011-06-28 10:37:41

标签: c# sql-server nhibernate stored-procedures

我无法使用NHibernate运行我的存储过程(SQL Server)。我有以下映射:

<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.

我不知道这些论点有什么问题?我还read一些关于'?'的事情。作为参数的占位符,但我不太明白。

存储过程的签名:

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

如果我在Server Management Studio中执行类似的操作,则可以:

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

thx for tipps。

sl3dg3

1 个答案:

答案 0 :(得分:1)

我建议您打开调试并实际检查额外参数是什么。您应该能够确切地看到哪个字段是问题所在。查看生成的SQL可能就足够了,或者您可能必须配置log4net记录器(log4net是NHibernate内部使用的调试器)。

要在控制台中显示生成的SQL,请将以下属性添加(或修改)到session-factory部分内的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. 编辑3:

    您可以尝试将映射文件更改为:

     <sql-query name="udp_MyStoredProc">
         <return-scalar column="ResId" type="Int32"/>
         EXEC udp_MyStoredProc: ?, ?    
     </sql-query>