2011-06-28 369 views
1

我不能让我的存储过程(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.

我不知道什么是错的做参数呢?我也read东西关于'?'作为参数的占位符,但我不太明白。

签名的存储过程:

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

如果我做服务器Management Studio中这样的事情,它的工作原理:

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

THX任何的窍门。

sl3dg3

+6

灿你向我们展示你的存储过程的定义? –

+0

@ marc_s,对不起,我忘了 - >更新。 – sl3dg3

+0

我对(不再)对NHibernate非常熟悉 - 但我会认为'是问题所在。如果你删除那一个映射片断? –

回答

1

我会建议您切换调试和实际检查的额外的参数是什么。您应该能够确切地看到哪个字段是问题。查看生成的SQL可能就足够了,或者您可能必须配置一个记录器(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返回的列的名称应该与返回标量映射中定义的列的名称相同。您可以转换列,如:

    选择场返回 AS渣油

编辑3:

,你可以尝试改变你的映射文件:

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

我有附加的log4net,正如我之前写的,它确实查询'EXEC udp_MyStoredProc @Id = @ p0,@Name = @ p1'。如果我在sql查询窗口中运行这个(例如:'EXEC udp_copy_event @Id = 30,@Name ='test''),它会运行良好... – sl3dg3

+0

好吧,那么你的问题是与“补液”任何实体将持有存储过程返回的数据。当从查询窗口内运行SP时,它是否返回单个值,多行或多列? – Franchesca

+0

没有想到这一点...我在我的存储过程结束时有'SELECT @FirstId,@ SecondId'之类的东西。两个整数(多列,一行)。我测试它没有选择,仍然是相同的结果... – sl3dg3