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" });
我有一个抛出异常的简单查询(见下文)。
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" });