2011-01-24 2 views
2

Bonjour J'essaie d'utiliser la procédure stockée dans NHibernate et j'ai trouvé quelques méthodes:comment utiliser une procédure stockée dans NHibernate

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <sql-query name="CO_Visites_Treeview_Sel"> 
    exec CO_Visites_Treeview_Sel :Idclient, :Idmagasin, :Autre, :Tous 
    </sql-query> 
</hibernate-mapping> 

Si je veux utiliser les données que j'utiliserai:

var query = session.GetNamedQuery("CO_Visites_Treeview_Sel"); 
query.SetString("Idclient", lstClients.SelectedValue.ToString()); 
query.SetInt32("Idmagasin", 36); 
query.SetBoolean("Autre", false); 
query.SetBoolean("Tous", true); 
var results = query.List(); 

Dans ce cas, je ne vais pas avoir intellisence ni résultat [ 'colName']

-je utiliser une autre méthode:

<?xml version="1.0" encoding="utf-8" ?> 
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
     <class name="NHibernate.DataAccess.Models.Visites_Treeview,NHibernate.DataAccess" lazy="true"> 
     <id name="Idvisite" column="IDVISITE" type="string"> 
      <generator class="assigned" /> 
     </id> 
     <property column="NOMMAGASIN" name="Nommagasin" type="string" /> 
     <property column="DATEVIS" name="Datevis" type="DateTime" /> 
     <property column="INTERVENTION" name="Intervention" type="Boolean" /> 
     <property column="IDFACTURE" name="Idfacture" type="string" /> 
     <property column="STATUT" name="Statut" type="byte" /> 
     <property column="NOFACTURE" name="Nofacture" type="int" /> 
     <property column="NODEVIS" name="Nodevis" type="int" /> 
     <property column="LIVRE" name="Livre" type="Boolean" /> 
     <property column="NOCOMMANDE" name="Nocommande" type="int" /> 
     <property column="COMPTABILISEE" name="Comptabilisee" type="Boolean" /> 
     <property column="RECUP" name="Recup" type="Boolean" /> 
     <property column="MASQUE" name="Masque" type="Boolean" /> 
     </class> 
     <sql-query name="CO_Visites_Treeview_Sel"> 
     <return alias="Visites_Treeview" class="NHibernate.DataAccess.Models.Visites_Treeview,NHibernate.DataAccess"> 
      <return-property column="NOMMAGASIN" name="Nommagasin" /> 
      <return-property column="IDVISITE" name="Idvisite" /> 
      <return-property column="DATEVIS" name="Datevis" /> 
      <return-property column="INTERVENTION" name="Intervention" /> 
      <return-property column="IDFACTURE" name="Idfacture" /> 
      <return-property column="STATUT" name="Statut" /> 
      <return-property column="NOFACTURE" name="Nofacture" /> 
      <return-property column="NODEVIS" name="Nodevis" /> 
      <return-property column="LIVRE" name="Livre" /> 
      <return-property column="NOCOMMANDE" name="Nocommande" /> 
      <return-property column="COMPTABILISEE" name="Comptabilisee" /> 
      <return-property column="RECUP" name="Recup" /> 
      <return-property column="MASQUE" name="Masque" /> 
     </return> 
     exec CO_Visites_Treeview_Sel :Idclient, :Idmagasin, :Autre, :Tous 
     </sql-query> 
    </hibernate-mapping> 

J'ai créé une classe de haricots. Dans ce cas, les résultats auront un objet fortement typé mais j'ai un problème de cohérence. Mais je n'ai pas d'identifiant réel donc s'il y a deux Idvisite, le second sera ignoré. J'ai essayé de créer une clé composite, mais cela ne fonctionne pas.

<composite-id> 
    <key-property name="Idvisite" column="IDVISITE" type="string" /> 
    <key-property name="Idfacture" column="IDFACTURE" type="string" /> 
</composite-id> 

Et j'ai une erreur:

could not execute query 
[ exec CO_Visites_Treeview_Sel @p0, @p1, @p2, @p3 ] 
    Name:Idclient - Value:036000004130 Name:Idmagasin - Value:36 Name:Autre - Value:False Name:Tous - Value:True 
[SQL: exec CO_Visites_Treeview_Sel @p0, @p1, @p2, @p3] 

Quelqu'un peut-il me dire comment faire?

Cordialement

Répondre

9

Essayez, votre cartographie: -

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <sql-query name="CO_Visites_Treeview_Sel"> 
    exec CO_Visites_Treeview_Sel :Idclient, :Idmagasin, :Autre, :Tous 
    </sql-query> 
</hibernate-mapping> 

utilisation SetResultTransformer ...

var results = Session 
    .GetNamedQuery("CO_Visites_Treeview_Sel") 
    .SetString("Idclient", lstClients.SelectedValue.ToString()) 
    .SetInt32("Idmagasin", 36) 
    .SetBoolean("Autre", false) 
    .SetBoolean("Tous", true) 
    .SetResultTransformer(new AliasToBeanResultTransformer(typeof(YOURCLASS))); 

return results.List<YOURCLASS>(); 

et YourClass est: -

public class YOURCLASS 
{ 
    public virtual int ColA { get; set; } 
    public virtual string COLB { get; set; } 
    public virtual int COLC { get; set; } 
    // etc.. 
} 

HTH

+0

ça marche, merci beaucoup –

Questions connexes