2012-11-08 4 views
2

J'ai un projet utilisant NHibernate 2.1.2.4000 avec .Net OracleClient, pour me connecter à une ancienne base de données de production Oracle 8i. J'ai implémenté un ICriteria, qui génère la requête correcte, mais l'exception interne suivante est déclenchée: System.Data.OracleClient.OracleException: ORA-12704: incompatibilité de jeu de caractères.NHibénate. Comment définir IType dans Projections.Constant?

return Session. 
       CreateCriteria<Carrera>(). 
       SetProjection(Projections.SqlFunction("concat", NHibernateUtil.AnsiString, Projections.Property("Descripcion"), Projections.Constant(s), Projections.Property("Id"))). 
       Add(Expression.InsensitiveLike("Descripcion", filter.Trim(), MatchMode.Anywhere)). 
       SetMaxResults(cant). 
       List<String>(); 

Ma question est: Comment puis-je déclarer la ITYPE AnsiString dans les arguments de Projections.Constant (objet, ITYPE)? Je pense que cela pourrait éventuellement résoudre le problème. J'ai testé enlever Projections.Constant(), et tout fonctionne très bien.

requête générée Exemple:

select 
    * 
from 
    (SELECT 
     (this_.CARR_DESCRIPCION||:p0||this_.CARR_CODIGO) as y0_ 
    FROM 
     CARRERAS this_ 
    WHERE 
     lower(this_.CARR_DESCRIPCION) like :p1) 
where 
    rownum <=:p2; 
:p0 = ', código: ', :p1 = '%2451%', :p2 = 20 

Merci à l'avance.

Répondre

1

Projections.Constant(s, NHibernateUtil.AnsiString) peut-être?

+0

D'abord, désolé pour la réponse tardive. J'ai essayé mais ça n'a pas marché. La solution difficile qui a finalement été d'insérer une constante numérique -999), puis dans les résultats remplacer chaque correspondance du nombre avec la chaîne désirée (", código:"). – GCuevasR

+0

Renvoyer la session. CreateCriteria (). SetProjection (Projections.SqlFunction ("concat", NHibernateUtil.String, Projections.Property ("Descripcion"), Projections.Constant (-999), Projections.Property ("Id"))). Add (Expression.InsensitiveLike ("Descripcion", filter.Trim(), MatchMode.Anywhere)). SetMaxResults (dévers). Liste (); – GCuevasR

+0

J'ai également essayé de définir le type avec ceci: NHibernateUtil.GetSerializable (typeof (NHibernate.Type.AnsiStringType)) – GCuevasR

Questions connexes