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

uqxowvwt  于 2022-11-07  发布在  DB2
关注(0)|答案(1)|浏览(149)

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

  • myTable* 表具有类型为Time的列,nHibernate尝试通过Int64将该列转换为TimeSpan

我看到在使用Map时有TimeAsTimeSpan约定。
但我没有任何Map。
那么,不使用Map如何实现呢?

我的代码

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)

**安装程序:**nhib5.2,.net 4.6.2,数据库为Db2

g2ieeal7

g2ieeal71#

我们找到了解决这个问题的方法,所以如果有人有同样的问题。这里是解决方法。
必须将类型作为TimeAsTimeSpanType注册到类型工厂
就像这样:

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

相关问题