Otro error que no entiendo bien, esta vez es al guardar una entidad,
el código es:

        using (var sesion = _sessionFactory.OpenSession())
        {
          sesion.SaveOrUpdate(capa);
          sesion.Flush();
        }

Cuando hace el Flush me salta una excepción que dice:

El método de prueba
Emuasa.KioskoCartaPago.Tests.TestsDominio.PuedoCrearUnaCartaDePagoYEliminarla
produjo la excepción:  System.IndexOutOfRangeException: Índice 35 no
válido para OdbcParameterCollection con Count=35..

35 son los campos que tiene la tabla en la base de datos, lo extraño
es que la consulta que ejecuta es esta:

NHibernate: SELECT capa_.CPPOLI, capa_.CPANYC, capa_.CPNUCP,
capa_.CPANYP, capa_.CPPERI, capa_.CPANYC as CPANYC3_, capa_.CPNUCP as
CPNUCP3_, capa_.CPSERV as CPSERV3_, capa_.CPANYF as CPANYF3_,
capa_.CPSERI as CPSERI3_, capa_.CPNUFA as CPNUFA3_, capa_.CPEEXT as
CPEEXT3_, capa_.CPORIG as CPORIG3_, capa_.CPPOLI as CPPOLI3_,
capa_.CPNIF as CPNIF3_, capa_.CPZALF as CPZALF3_, capa_.CPANYP as
CPANYP3_, capa_.CPPERI as CPPERI3_, capa_.CPSITU as CPSITU3_,
capa_.CPIMEU as CPIMEU3_, capa_.CPTICB as CPTICB3_, capa_.CPFECP as
CPFECP3_, capa_.CPFLCO as CPFLCO3_, capa_.CPEMIS as CPEMIS3_,
capa_.CPGUI1 as CPGUI20_3_, capa_.CPSUFI as CPSUFI3_, capa_.CPREFE as
CPREFE3_, capa_.CPGUI2 as CPGUI23_3_, capa_.CPIDEN as CPIDEN3_,
capa_.CPAPAG as CPAPAG3_, capa_.CPBARR as CPBARR3_, capa_.CPT1VB as
CPT27_3_, capa_.CPT2VB as CPT28_3_, capa_.CPT3VB as CPT29_3_,
capa_.CPANRE as CPANRE3_, capa_.CPNREL as CPNREL3_, capa_.CPFECO as
CPFECO3_, capa_.CPNORD as CPNORD3_, capa_.CPFEIL as CPFEIL3_,
capa_.CPDIFE as CPDIFE3_ FROM PRUEMUASA.CAPA capa_ WHERE
capa_.CPPOLI=? and capa_.CPANYC=? and capa_.CPNUCP=? and
capa_.CPANYP=? and capa_.CPPERI=?;p0 = 201688 [Type: Int32 (0)], p1 =
1900 [Type: Int32 (0)], p2 = 999999 [Type: Int32 (0)], p3 = 0 [Type:
Int32 (0)], p4 = 0 [Type: Int32 (0)]

Y ahí solo hay 4 parámetros; y digo extraño por que yo esperaba que la
consulta fuera un INSERT, pero se ve que antes de guardar hace un
select para ver si existe.

El hbm es:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Emuasa.KioskoCartaPago.Dominio.Capa,
Emuasa.KioskoCartaPago.Dominio" lazy="true" table="PRUEMUASA.CAPA">
    <composite-id>
      <key-property name="CPPOLI"/>
      <key-property name="CPANYC"/>
      <key-property name="CPNUCP"/>
      <key-property name="CPANYP"/>
      <key-property name="CPPERI"/>
    </composite-id>

    <property name="CPANYC"/>

    <property name="CPNUCP"/>

    <property name="CPSERV"/>

    ....
    ....

  </class>
</hibernate-mapping>

El AS400 me lleva loco :)

On 9 dic, 12:47, tolemaC <[email protected]> wrote:
> Hola gente,
>
> Estoy empezando a usar NHibernate para acceder a nuestro viejo AS400
> en mi empresa. Me he creado 3 entidades y sus mapeos y estoy jugando
> un poco.
> Las primeras pruebas las he hecho usando LinQ para seleccionar los
> resultados y todo me ha ido bien, pero al incorporar un test de otro
> proyecto donde verifico que todos los mappings son correctos y puedo
> acceder a todas las entidades mapeadas me está dando un error, me
> suelta toda la SQL que ejecuta y me dice:
>
> El método de prueba
> KioskoCartaPago.Tests.TestsDominio.ExistenMappingsDeHibernateYTodosEstanCor 
> rectos
> produjo la excepción:  NHibernate.Exceptions.GenericADOException:
> could not execute query
> [ .. "Sentencia select SQL (No la pongo por que es muy larga)" .. ] --->  
> System.InvalidOperationException: El objeto que acepta valores Null
>
> debe tener un valor..
>
> System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource
> resource)
> NHibernate.Dialect.DB2Dialect.GetLimitString(SqlString querySqlString,
> Int32 offset, Int32 limit, Nullable`1 offsetParameterIndex, Nullable`1
> limitParameterIndex) en d:\CSharp\NH\nhibernate\src\NHibernate\Dialect
> \DB2Dialect.cs: línea 218
> NHibernate.Loader.Loader.PrepareQueryCommand(QueryParameters
> queryParameters, Boolean scroll, ISessionImplementor session) en d:
> \CSharp\NH\nhibernate\src\NHibernate\Loader\Loader.cs: línea 1119
> NHibernate.Loader.Loader.DoQuery(ISessionImplementor session,
> QueryParameters queryParameters, Boolean returnProxies) en d:\CSharp\NH
> \nhibernate\src\NHibernate\Loader\Loader.cs: línea 399
> NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImp 
> lementor
> session, QueryParameters queryParameters, Boolean returnProxies) en d:
> \CSharp\NH\nhibernate\src\NHibernate\Loader\Loader.cs: línea 236
> NHibernate.Loader.Loader.DoList(ISessionImplementor session,
> QueryParameters queryParameters) en d:\CSharp\NH\nhibernate\src
> \NHibernate\Loader\Loader.cs: línea 1665
> Emuasa.KioskoCartaPago.Tests.TestsDominio.ExistenMappingsDeHibernateYTodosE 
> stanCorrectos()
> en C:\Desarrollo\Net\KioskoNotasPago\Emuasa.KioskoCartaPago.Tests
> \TestsDominio.cs: línea 99
>
> La cosa es que he ejecutado la query SQL sobre el AS400 y funciona
> bien.
>
> De hecho ya había probado antes algunas cosas e iban bien, entonces
> busqué cual es la diferencia entre las pruebas anteriores y ésta,
> hasta que encontré la diferencia; El error me surge cuando uso
> "SetMaxResult"
>
> Básicamente es esto, la primera sentencia me da el error, la segunda
> funciona bien sin problemas:
>
> sesion.CreateCriteria(typeof(Abon)).SetMaxResults(1).Add(Restrictions.Eq("A 
> BPOLI",
> 201688 )).List<Abon>();
>
> sesion.CreateCriteria(typeof(Abon)).Add(Restrictions.Eq("ABPOLI",
> 201688 )).List<Abon>();
>
> Como información adicional deciros que uso este Dialecto:
> NHibernate.Dialect.DB2400Dialect
> sobre este driver: NHibernate.Driver.OdbcDriver
>
> Un saludo,

-- 
Para escribir al Grupo, hágalo a esta dirección: 
[email protected]
Para más, visite: http://groups.google.com/group/NHibernate-Hispano

Responder a