2011-06-28 18 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何かについて '?'パラメータのプレースホルダとして、私はそれをかなり理解していません。ストアドプロシージャの

署名:私はServer Management Studioの中にこのような何かを行う場合は

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

、それは動作します:すべてのティップスのため

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

THX。

sl3dg3

+6

ができますストアドプロシージャの定義を表示しますか? –

+0

@ marc_s、申し訳ありませんが、私は忘れました - >更新しました。 – sl3dg3

+0

私は(もはや)NHibernateに精通していますが、 ''が問題だと思います。その1つのマッピングフラグメントを削除するとどうなりますか? –

答えて

1

私は、デバッグをオンにすることをお勧めしますし、実際に余分な引数が何であるかをチェックします。どのフィールドが問題であるかを正確に見ることができるはずです。生成されたSQLを見るだけで十分でしょう。あるいは、log4netロガーを構成する必要があります(log4netは、Hibernateが内部で使用するデバッガーです)。セッション・ファクトリーセクション中にあなたNHibernateの設定ファイルに追加(または変更)、次のプロパティをコンソールで生成されたSQLを表示するには

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

編集:私はより多くを追加することができますlog4netのの詳細あなたがそれを必要とする場合:)

EDIT 2:チェックするために他のものあなたはこのエラーを取得する場合

  1. あなたのSPはただ1つの値を返すべきです
  2. あなたのSPによって返される列の名前は、あなたのリターンスカラーマッピングで定義された列の名前と同じでなければなりません。あなたがあなたのマッピングファイルを変更してみてください可能性が

    :EDIT 3

残油ASを返すように フィールドを選択

:あなたは、カラム、例えばキャストでき

<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-queryウィンドウ内で実行すると(例: 'EXEC udp_copy_event @Id = 30、@Name = 'test'')、それはちょうど正常に実行されます... – sl3dg3

+0

あなたの問題は" rehydration "ですどのエンティティでもストアドプロシージャから返されたデータを保持します。クエリウィンドウ内からSPを実行すると、単一の値、複数の行、または複数の列が返されますか? – Franchesca

+0

そのことを考えていませんでした...私はストアドプロシージャの最後に 'SELECT @ FirstId、@ SecondId'のようなものがあります。 2つの整数(複数の列、1つの行)。私はそれを選択したままでテストしましたが、結果は同じです... – sl3dg3

関連する問題