2011-08-25 4 views
3

Tout d'abord, je suis désolé de poser à nouveau cette question quand il y a plusieurs ressources qui (théoriquement) l'expliquent. J'ai énuméré les références que j'ai employées au fond de cette question, j'espère qu'ils aideront quelqu'un d'autre si rien d'autre. J'essaie d'exécuter un proc stocké simple sur une base de données Oracle 11. Mon intention est de créer un objet List {T} à partir de données renvoyées via un SYS_REFCURSOR. Je reçois ce message d'erreur dès que je tente de créer un objet de la session NHibernate: { « erreurs dans les requêtes nommées: {} GET_COLLATERAL »}Impossible d'exécuter la procédure stockée avec nHibernate

Voici ma carte. L'espace de noms, le schéma, l'assemblage, le nom de la requête sont épelés correctement. Le fichier s'appelle GetCollateral.hbm.xml et est marqué comme une ressource incorporée.

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="Poolman" namespace="Poolman.Entities" schema="poolman_own"> 
    <sql-query name="GET_COLLATERAL" callable="true"> 
    <return class="Poolman.Entities.IDNamePair"> 
     <return-property name="ID" column="sort_order"></return-property> 
     <return-property name="Name" column="collateral"></return-property> 
    </return> 
    {GET_COLLATERAL(?)} 
    </sql-query> 
</hibernate-mapping> 

Après avoir réussi un peu de dépannage pour obtenir un objet de la session à créer par removeing ​​l'élément de retour de la cartographie comme indiqué ci-dessous. Apparemment, il y a quelque chose qui ne va pas mais je ne sais pas quoi.

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="Poolman" namespace="Poolman.Entities" schema="poolman_own"> 
    <sql-query name="GET_COLLATERAL" callable="true"> 
    {GET_COLLATERAL(?)} 
    </sql-query> 
</hibernate-mapping> 

Je ne vous attendez pas à un jeu de résultats sans carte de retour, mais en utilisant la mise en correspondance ci-dessus permet NHibernate de créer sa obect de session et d'essayer d'exécuter la requête. Cependant, nHibernate ne peut pas avoir ses paramètres correctement. Je reçois ce message d'erreur:

{ "nombre de paramètres de position attendu: 1, les paramètres réels: [] [{GET_COLLATERAL} (?)]"}

J'ai essayé:

CALL GET_COLLATERAL (

BEGIN GET_COLLATERAL(); FIN;

ci-dessus enveloppé dans CDATA

Voici mon proc stocké:

create or replace 
PROCEDURE GET_COLLATERAL(p_cursor OUT SYS_REFCURSOR) 
IS 

BEGIN 
    OPEN p_cursor for 
    SELECT collateral, sort_order 
    FROM 
    (
    -- Long query omitted. The query executes when pasted into a command window. 

) ORDER BY sort_order ; 

END; 

Voici ma classe d'entité. Cette classe ne correspond à aucune table mais j'ai essayé de créer un mapping de toute façon.

namespace Poolman.Entities 
{ 
    public class IDNamePair 
    { 
     public virtual int ID { get; set; } 
     public virtual string Name { get; set; } 
    } 
} 



<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping assembly="Poolman" 
        namespace="Poolman.Entities" 
        schema="poolman_own" 
        xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="IDNamePair" table="x"> 
    <id></id> 
    <property name="ID" column="sort_order"/> 
    <property name="Name" column="collateral"/> 
    </class> 
</hibernate-mapping> 

Voici le code que je utilise pour appeler la requête:

public List<Entities.IDNamePair> GetCollateral() 
     { 
      IQuery query = (IQuery)Session.GetNamedQuery("GET_COLLATERAL"); 
      List<Entities.IDNamePair> list = new List<Entities.IDNamePair>(); 
      System.Collections.IList result = query.List(); 
      list = result.OfType<Entities.IDNamePair>().ToList(); 
      return list; 
     } 

J'apprécie vraiment toute aide à ce sujet. Je suis coincé. Voici les liens vers d'autres ressources que j'ai trouvé, personne ne peut me aider cependant: Désolé stackoverflow ne me permet d'afficher deux liens:

Oracle stored procedures, SYS_REFCURSOR and NHibernate

http://www.techonthenet.com/oracle/questions/cursor1.php

+0

Pourquoi voulez-vous le faire en utilisant NHibernate quand vous pouvez facilement le faire en utilisant ADO? – TedOnTheNet

+0

Je n'ai pas eu beaucoup de chance avec les paramètres ordinaux moi-même avez-vous essayé les paramètres nommés? http://hoolihan.net/blog-tim/2011/06/23/nh-named-sql-queries-with-parameters/ –

Répondre

0

Peut-être que deux considérations qui pourrait être fait pour ce problème:

  • D'abord, la procédure stockée qui n'a pas de paramètres d'entrée, ne nécessite pas d'être appelée avec des paramètres, de sorte que ce commentaire de questions dit calling sp with out ref cursor appel de la SP de cette manière { call GET_COLLATERAL }
  • En second lieu, d'utiliser un « non cartographié » classe comme jeu de résultats, vous devriez demander à NHibernate à propos de cette classe « non cartographié », alors essayez d'ajouter <import class="FullClassName" rename="ClassNameMayBeRenamed"/> en haut du fichier de mappage

donc, cela pourrait être une cartographie de ce SP:

.... 
<import class="Poolman.Entities.IDNamePair" /> 
.... 
<sql-query name="GET_COLLATERAL" callable="true"> 
    <return class="Poolman.Entities.IDNamePair"> 
     <return-property name="ID" column="sort_order"></return-property> 
     <return-property name="Name" column="collateral"></return-property> 
    </return> 
    { call GET_COLLATERAL} 
</sql-query> 

Le code d'appel pourrait être un code simple d'appeler un SP par NHibernate .. J'espère que cela pourrait être votre solution. S'il vous plaît laissez-moi savoir si je me trompe

Cordialement

Questions connexes