Ошибка преобразования NHibernate QueryOver в типе даты DB2 - PullRequest
0 голосов
/ 28 марта 2012

Я новичок в NHibernate и надеюсь, что смогу найти определенную помощь в отслеживании источника ошибки конвертации, которую я получаю при попытке использовать сравнение DateTime для предиката.

return _session.QueryOver<ShipmentSegment>()
                .Where(ss => ss.SegmentOrigin == selOrig)
                // Whenever I add the predicate for the SegmentDate below
                // I receive a conversion error
                .And(ss => ss.SegmentDate == selDate)
                .List<ShipmentSegment>();

Исключение

NHibernate.Exceptions.GenericADOException was unhandled by user code
  Message=could not execute query
[ SELECT this_.ajpro# as ajpro1_28_0_, this_.ajleg# as ajleg2_28_0_, this_.ajpu# as ajpu3_28_0_, this_.ajlorig as ajlorig28_0_, this_.ajldest as ajldest28_0_, this_.segdate as segdate28_0_, this_.ajldptwin as ajldptwin28_0_, this_.ajlfrtype as ajlfrtype28_0_, this_.ajlfrdest as ajlfrdest28_0_, this_.ajtpmfst# as ajtpmfst10_28_0_, this_.ajspplan as ajspplan28_0_, this_.ajhload as ajhload28_0_ FROM go52cst.tstshprte this_ WHERE this_.ajlorig = @p0 and this_.segdate = @p1 ]
  Name:cp0 - Value:WIC  Name:cp1 - Value:3/28/2012 12:00:00 AM

Внутреннее исключение

Message=A conversion error occurred.
       Source=IBM.Data.DB2.iSeries
       ErrorCode=-2147467259
       MessageCode=111
       MessageDetails=Parameter: 2.
       SqlState=""
       StackTrace:


 - at IBM.Data.DB2.iSeries.iDB2Exception.throwDcException(MpDcErrorInfo
 mpEI, MPConnection conn)
 - at IBM.Data.DB2.iSeries.iDB2Command.openCursor()
 - at IBM.Data.DB2.iSeries.iDB2Command.ExecuteDbDataReader(CommandBehavior
 behavior)
 - at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()
 - at NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd)
 - at NHibernate.Loader.Loader.GetResultSet(IDbCommand st, Boolean autoDiscoverTypes, Boolean callable, RowSelection selection,
   ISessionImplementor session)
 - at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
 - at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor
   session, QueryParameters queryParameters, Boolean returnProxies)
 - at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)

Я ценю все, что может помочь направить меня в правильном направлении.

1 Ответ

1 голос
/ 17 июля 2012

Мой опыт работы с этим конкретным исключением из iSeries возник при создании параметра (из iDB2TypeParameter) для списка параметров команды ADO.NET для команды ADO типа процедуры хранения.Я должен был явно указать, какой тип iDB2DbType использовать: iDB2DbType.Date, iDB2DbType.Time или iDB2DbType.TimeStamp.Поставщик iSeries ADO не может знать, какой из трех типов использовать при создании параметра из типа .NET System.DateTime.

new iDB2Parameter(parameterName, iDB2DbType.Date){ Value = myValue };
new iDB2Parameter(parameterName, iDB2DbType.Time){ Value = myValue };
new iDB2Parameter(parameterName, iDB2DbType.TimeStamp){ Value = myValue };

Я понимаю, что вы не создаете параметры вручную, какэтот пример, но вместо этого с помощью NHibernate.Итак, я хотел бы убедиться, что поставщик LINQ NHibernate для DB2 / iSeries знает об этом.Это ничего не значит против NHibernate, я просто нахожу практически невозможным найти хороший и надежный ORM для DB2 / iSeries.

...