2011-06-28 4 views
1

Je ne peux pas exécuter ma procédure stockée (SQL Server) avec NHibernate. Je suit la cartographie:Procédures stockées avec des arguments

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

du code:

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

Il en résulte une exception près:

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

Je ne sais pas quel est le problème avec le arguments? J'ai aussi read quelque chose à propos de '?' comme des espaces réservés pour les paramètres, mais je ne comprends pas tout à fait.

Signature de la procédure stockée:

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

Si je fais quelque chose comme cela dans Management Studio Server, cela fonctionne:

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

thx pour tout Tipps.

sl3dg3

+6

Can vous nous montrez la définition de votre proc stocké? –

+0

@ marc_s, désolé, j'ai oublié -> mis à jour. – sl3dg3

+0

Je ne suis plus (très) familier avec NHibernate - mais je pense que le '' est le problème. Que faire si vous supprimez ce fragment de cartographie? –

Répondre

1

Je vous recommande de passer le débogage et fait vérifier ce que l'argument supplémentaire est. Vous devriez être capable de voir exactement quel champ est le problème. Il peut suffire de regarder le SQL généré, ou vous devrez peut-être configurer un logger log4net (log4net est le débogueur utilisé par NHibernate en interne).

Pour afficher le SQL généré dans la console, ajouter (ou modifier) ​​la propriété suivante dans votre fichier de configuration NHibernate dans la section session usine:

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

EDIT: Je peux ajouter plus détails sur Log4Net si vous en avez besoin :)

EDIT 2: d'autres choses à vérifier si vous obtenez cette erreur

  1. Votre SP ne doit renvoyer qu'une seule valeur
  2. Le nom de la colonne renvoyée par votre SP doit être le même que le nom de la colonne définie dans votre mappage retour-scalaire. Vous pouvez lancer la colonne, par exemple:

    SELECT champ pour retourner AS ResId

EDIT 3:

vous pouvez essayer de changer votre fichier de mappage à:

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

J'ai le log4net attaché, et comme je l'ai écrit plus tôt, il interroge vraiment 'EXEC udp_MyStoredProc @Id = @ p0, @Name = @ p1'. Si je lance ceci dans la fenêtre sql-query (ex: 'EXEC udp_copy_event @Id = 30, @Name = 'test''), ça fonctionne bien ... – sl3dg3

+0

Ok, alors votre problème est avec la" réhydratation "de quelle que soit l'entité qui va contenir les données retournées par la procédure stockée. Lorsque vous exécutez le SP à partir de la fenêtre de requête, renvoie-t-il une seule valeur, plusieurs lignes ou plusieurs colonnes? – Franchesca

+0

N'a pas pensé à cela ... J'ai quelque chose comme 'SELECT @FirstId, @ SecondId' à la fin de ma procédure stockée. Deux entiers (plusieurs colonnes, une ligne). Je l'ai testé sans sélectionner, toujours le même résultat ... – sl3dg3