-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 
Author Message
 Post subject: Problem beim Zugriff auf Oracle DateTime
PostPosted: Thu Aug 16, 2007 11:17 am 
Newbie

Joined: Thu Aug 16, 2007 11:07 am
Posts: 9
Hallo,

ich habe ein seltsames Problem beim Zugriff auf ein Oracle DateTime Feld. Bei einigen Einträgen der Relation klappt das Mapping mit NHibernate, bei anderen nicht. Ich kann keinen erkennbaren unterschied in den Daten der entsprechenden Felder festellen (abgesehen davon, dass die Zeitangaben leicht variieren).

Im Mapping File steht folgendes:

<property column="EINGANGSDATUM" type="DateTime" name="EingangsDatum" not-null="false"/>

Es handelt sich um ein Feld der Relation Bestellungen. Ich versuche wie folgt darauf zuzugreifen:

ICriteria crit = session.CreateCriteria(typeof(Bestellungen));
ArrayList list = (ArrayList)crit.List();

Was mache ich falsch? Es handelt sich um eine bestehende Relation mit einer Reihe von Einträgen. Das Feld bei dem es schief läuft ist wie gesagt ein DateTime Feld, die Daten sind alle auf die gleiche Weise eingefügt worden. Wenn das Feld leer ist, dann klappt es und bei einigen Tupeln klappt es auch mit einem Wert im Feld.
Wenn ich bei den Tupeln, bei denen ein Fehler auftritt, das Feld lösche, dann funktioniert es danach auch. Es ist aber kein Erkennbarer Unterschied in den Daten zu sehen!

Hibernate version:1.2.0.4000

Full stack trace of any exception that occurs:
System.ArgumentOutOfRangeException: Die Parameter "Hour", "Minute" und "Second" beschreiben eine nicht darstellbare DateTime.
bei System.DateTime.TimeToTicks(Int32 hour, Int32 minute, Int32 second)
bei System.Data.OracleClient.OracleDateTime.ToDateTime(Byte[] rawValue)
bei System.Data.OracleClient.OracleDateTime.MarshalToDateTime(NativeBuffer buffer, Int32 valueOffset, Int32 lengthOffset, MetaType metaType, OracleConnection connection)
bei System.Data.OracleClient.OracleColumn.GetDateTime(NativeBuffer_RowBuffer buffer)
bei System.Data.OracleClient.OracleColumn.GetValue(NativeBuffer_RowBuffer buffer)
bei System.Data.OracleClient.OracleDataReader.GetValue(Int32 i)
bei System.Data.OracleClient.OracleDataReader.get_Item(Int32 i)
bei NHibernate.Type.DateTimeType.Get(IDataReader rs, Int32 index)
bei NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String name)
bei NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String[] names, ISessionImplementor session, Object owner)
bei NHibernate.Type.AbstractType.Hydrate(IDataReader rs, String[] names, ISessionImplementor session, Object owner)
bei NHibernate.Loader.Loader.Hydrate(IDataReader rs, Object id, Object obj, ILoadable persister, ISessionImplementor session, String[][] suffixedPropertyColumns)
bei NHibernate.Loader.Loader.LoadFromResultSet(IDataReader rs, Int32 i, Object obj, Type instanceClass, EntityKey key, LockMode lockMode, ILoadable rootPersister, ISessionImplementor session)
bei NHibernate.Loader.Loader.InstanceNotYetLoaded(IDataReader dr, Int32 i, ILoadable persister, EntityKey key, LockMode lockMode, EntityKey optionalObjectKey, Object optionalObject, IList hydratedObjects, ISessionImplementor session)
bei NHibernate.Loader.Loader.GetRow(IDataReader rs, ILoadable[] persisters, EntityKey[] keys, Object optionalObject, EntityKey optionalObjectKey, LockMode[] lockModes, IList hydratedObjects, ISessionImplementor session)
bei NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet, ISessionImplementor session, QueryParameters queryParameters, LockMode[] lockModeArray, EntityKey optionalObjectKey, IList hydratedObjects, EntityKey[] keys, Boolean returnProxies)
bei NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
bei NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
bei NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)
2007-08-16 16:13:24,814 [WARN ] (NHibernate.Util.ADOExceptionReporter): System.ArgumentOutOfRangeException: Die Parameter "Hour", "Minute" und "Second" beschreiben eine nicht darstellbare DateTime.
bei System.DateTime.TimeToTicks(Int32 hour, Int32 minute, Int32 second)
bei System.Data.OracleClient.OracleDateTime.ToDateTime(Byte[] rawValue)
bei System.Data.OracleClient.OracleDateTime.MarshalToDateTime(NativeBuffer buffer, Int32 valueOffset, Int32 lengthOffset, MetaType metaType, OracleConnection connection)
bei System.Data.OracleClient.OracleColumn.GetDateTime(NativeBuffer_RowBuffer buffer)
bei System.Data.OracleClient.OracleColumn.GetValue(NativeBuffer_RowBuffer buffer)
bei System.Data.OracleClient.OracleDataReader.GetValue(Int32 i)
bei System.Data.OracleClient.OracleDataReader.get_Item(Int32 i)
bei NHibernate.Type.DateTimeType.Get(IDataReader rs, Int32 index)
bei NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String name)
bei NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String[] names, ISessionImplementor session, Object owner)
bei NHibernate.Type.AbstractType.Hydrate(IDataReader rs, String[] names, ISessionImplementor session, Object owner)
bei NHibernate.Loader.Loader.Hydrate(IDataReader rs, Object id, Object obj, ILoadable persister, ISessionImplementor session, String[][] suffixedPropertyColumns)
bei NHibernate.Loader.Loader.LoadFromResultSet(IDataReader rs, Int32 i, Object obj, Type instanceClass, EntityKey key, LockMode lockMode, ILoadable rootPersister, ISessionImplementor session)
bei NHibernate.Loader.Loader.InstanceNotYetLoaded(IDataReader dr, Int32 i, ILoadable persister, EntityKey key, LockMode lockMode, EntityKey optionalObjectKey, Object optionalObject, IList hydratedObjects, ISessionImplementor session)
bei NHibernate.Loader.Loader.GetRow(IDataReader rs, ILoadable[] persisters, EntityKey[] keys, Object optionalObject, EntityKey optionalObjectKey, LockMode[] lockModes, IList hydratedObjects, ISessionImplementor session)
bei NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet, ISessionImplementor session, QueryParameters queryParameters, LockMode[] lockModeArray, EntityKey optionalObjectKey, IList hydratedObjects, EntityKey[] keys, Boolean returnProxies)
bei NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
bei NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
bei NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)


Name and version of the database you are using: Oracle 9.2i


Top
 Profile  
 
 Post subject:
PostPosted: Mon Aug 27, 2007 4:26 pm 
Expert
Expert

Joined: Tue Nov 23, 2004 7:00 pm
Posts: 570
Location: mostly Frankfurt Germany
Evt. datetime statt DateTime

_________________
Best Regards
Sebastian
---
Training for Hibernate and Java Persistence
Tutorials for Hibernate, Spring, EJB, JSF...
eBook: Hibernate 3 - DeveloperGuide
Paper book: Hibernate 3 - Das Praxisbuch
http://www.laliluna.de


Top
 Profile  
 
 Post subject:
PostPosted: Tue Aug 28, 2007 3:15 am 
Newbie

Joined: Thu Aug 16, 2007 11:07 am
Posts: 9
Hallo Sebastian,

vielen Dank für die Antwort. Leider liegt es daran nicht. Inzwischen habe ich herausgefunden, dass aus irgendeinem Grund in einigen Feldern scheinbar korrupte Daten liegen. Seltsamerweise tritt der Fehler sowohl beim Zugriff mit dem Oracle Treiber (ODP.NET in verschiedenen Versionen) als auch mit dem Microsoft Treiber für Ora auf. Mit dem JDBC Treiber tritt er hingegen nicht auf!

Die Daten in der Datenbank werden von der bestehenden Clientsoftware (Baujahr 1992) geschrieben.

Das verrückte ist, wenn ich exakt die gleichen Daten importiere, dann tritt bei Datum A beim ersten Import der Fehler auf und beim gleichen Datum im gleichen Eintrag der Relation beim nächsten Import nicht mehr.

Der Fehler ist immer im Feld MI oder SS (Minute oder Sekunde) und zwar wenn einer der Werte '59' ist. Wir schreiben jedoch nur Tag/Monat/Jahr.

Es scheint also kaum an NHibernate oder Oracle zu liegen sondern vermutlich an einem ungewöhnlichen Verhalten der bestehenden Clientsoftware (proprietärer Oracletreiber) oder an einer Inkompatibilität zwischen dem neuen Oracle Timestamp-Format und der alten Software die nur in bestimmten Fällen zum Tragen kommt.

Die Lösung zu der wir uns entschieden haben ist folgende: Wir erstellen ein "Datenbereinigungstool" in Java, dass die gesamten Datumswerte einmal ausliest und direkt wieder schreibt. Danach klappt auch der Zugriff mit dem ODP.NET Treiber, obwohl sich an den Daten >>eigentlich<< nichts geändert hat.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.