Db2: c# Nhibernate 使用时间列作为 TimeAsTimeSpan 抛出异常

Db2: c# Nhibernate using time column as TimeAsTimeSpan throws exception

我有一个抛出异常的简单查询(见下文)。

myTable table 有一个类型为 Time 的列,nHibernate 尝试 通过 Int64.

将其转换为 TimeSpan

我看到在使用映射时有 TimeAsTimeSpan 约定。

但是我没有映射。

那么,如果不使用映射,我该如何实现呢?

我的代码

        string sqlText = "Select * from myTable";

        ISQLQuery query = Session.CreateSQLQuery(sqlText);

        query.List(); // <-- fails with exception

抛出异常

NHibernate.Exceptions.GenericADOException: could not execute query
System.FormatException: Input string '10:01:40' was not in the correct format. ---> System.InvalidCastException: Unable to cast object of type 'System.TimeSpan' to type 'System.IConvertible'.
   at System.Convert.ToInt64(Object value)
   at NHibernate.Type.TimeSpanType.Get(DbDataReader rs, Int32 index, ISessionImplementor session)
   --- End of inner exception stack trace ---
   at NHibernate.Type.TimeSpanType.Get(DbDataReader rs, Int32 index, ISessionImplementor session)
   at NHibernate.Type.NullableType.NullSafeGet(DbDataReader rs, String name, ISessionImplementor session)
   at NHibernate.Loader.Custom.CustomLoader.ScalarResultColumnProcessor.Extract(Object[] data, DbDataReader resultSet, ISessionImplementor session)
   at NHibernate.Loader.Custom.CustomLoader.ResultRowProcessor.ExtractResultRow(Object[] data, DbDataReader resultSet, ISessionImplementor session)
   at NHibernate.Loader.Custom.CustomLoader.ResultRowProcessor.BuildResultRow(Object[] data, DbDataReader resultSet, Boolean hasTransformer, ISessionImplementor session)
   at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies, IResultTransformer forcedResultTransformer)
   at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies, IResultTransformer forcedResultTransformer)
   at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters, IResultTransformer forcedResultTransformer)

设置: 休眠 5.2, .net 4.6.2, 数据库是 Db2

我们找到了解决方案,所以如果有人遇到同样的问题。 这是解决方案。

您必须将类型作为 TimeAsTimeSpanType 注册到类型工厂

像这样:

TypeFactory.RegisterType(typeof(TimeSpan), new TimeAsTimeSpanType(), new List<string> { "TimeSpan" });