2008-10-31 9 views
4

J'ai beaucoup de mal à faire en sorte que les requêtes nommées fonctionnent avec nHibernate. Mon dernier problème est d'obtenir le message d'erreur "Impossible d'exécuter la requête" sans informations supplémentaires. Existe-t-il des exemples complets que je puisse télécharger de quelque part parce que tous les tutoriels et les exemples de documentation fournissent des extraits de code, mais ne racontent que la moitié de l'histoire de son fonctionnement.Requêtes nommées avec nHibernate

Voici le code qui me pose problème.

Classe

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
namespace Model.Entities 
{ 
    public class TableInfo 
    { 
     public string TABLENAME { get; set; } 
     public string COLUMNNAME { get; set; } 
     #region Overrides 
     public override int GetHashCode() 
     { 
      int result = TABLENAME.GetHashCode(); 
      result += COLUMNNAME.GetHashCode(); 
      return result; 
     } 
     public override bool Equals(object obj) 
     { 
      if (obj == null) return false; 
      TableInfo dict = (TableInfo)obj; 
      return 
       dict.TABLENAME.IsEqual(this.TABLENAME) && 
       dict.COLUMNNAME.IsEqual(this.COLUMNNAME); 
     } 
     #endregion 
    } 
} 

Mapping fichier

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Model.Entities" assembly="Model" default-lazy="false"> 

    <class name="Model.Entities.TableInfo, Model" table="UIM_TableColumnInfo"> 
    <composite-id> 
     <key-property name="TABLENAME" column="TABLENAME" type="string"></key-property> 
     <key-property name="COLUMNNAME" column="COLUMNNAME" type="string"></key-property> 
    </composite-id> 
    </class> 

    <sql-query name="GetTableInfo"> 
    <return alias="tableInfo" class="Model.Entities.TableInfo, Model"> 
     <return-property name="TABLENAME" column="TABLENAME"/> 
     <return-property name="COLUMNNAME" column="COLUMNNAME"/> 
    </return> 
    <![CDATA[ 
select 
     info.tci_table_name TABLENAME 
     , info.tci_column_name COLUMNNAME 
     from ALL_TAB_COLS c 
     ,(select 'DATE' TYPE_NAME, 'D' data_type_ind from dual 
      union select 'NUMBER','N' from dual 
      union select 'VARCHAR2','S' from dual 
     ) ct 
     , UIM_TableColumnInfo info 
     where c.DATA_TYPE   = ct.TYPE_NAME (+) 
       and c.column_id is not null 
     and UPPER(c.TABLE_NAME) = :TableName 
     and UPPER(c.COLUMN_NAME) = UPPER(info.tci_column_name (+)) 
     order by c.column_id 
    ]]> 
    </sql-query> 

</hibernate-mapping> 

appelle le code

public List<TableInfo> GetTableInfo(string tableName) 
{ 
    return m_TableInfoRepository 
     .NamedQuery("GetTableInfo") 
     .SetString("TableName", tableName) 
     .List<TableInfo>() as List<TableInfo>; 
} 

Répondre

0

Peut-être que je me trompe, mais il semble t Cela pourrait être un conflit entre la table "TABLENAME" et le paramètre ": TableName", que se passe-t-il si vous essayez d'utiliser un autre nom de paramètre?

+0

J'ai essayé cela mais je n'ai fait aucune différence. – Craig

0

L'exception interne doit fournir le SQL réel qui a été généré et essayé de s'exécuter. Collez ceci dans une requête de base de données et exécutez-le directement dans la base de données. Cela vous aidera à vous guider. Ce sera beaucoup plus facile une fois que vous saurez pourquoi le SQL n'a pas pu être exécuté