【发布时间】:2017-04-07 20:57:04
【问题描述】:
我有一个使用 Nhibernate 使用 session.CreateSQLQuery 执行的复杂查询。 在执行期间,我遇到了下一个异常:
无法将“System.TimeSpan”类型的对象转换为“System.IConvertible”类型。
似乎 NHibernate 无法正确处理字段类型 'time' 并期望那里的整数值。它适用于使用 xml 映射文件映射的实体的常规 HQL 查询。但是在我的情况下,我需要运行一个 sql 查询,因此无法指定映射。任何想法如何解决它?看起来像一个 NHibernate 错误。
NHibernate 版本:3.3.1.4
这是完整的堆栈跟踪:
无法将“System.TimeSpan”类型的对象转换为类型 'System.IConvertible'。在 System.Convert.ToInt64(对象值)
在 NHibernate.Type.TimeSpanType.Get(IDataReader rs, Int32 index) 中 p:\nhibernate-core\src\NHibernate\Type\TimeSpanType.cs:第 32 行内部 例外:输入字符串“08:00:00”的格式不正确。
在 NHibernate.Type.TimeSpanType.Get(IDataReader rs, Int32 index) 中 p:\nhibernate-core\src\NHibernate\Type\TimeSpanType.cs:第 36 行 NHibernate.Type.NullableType.NullSafeGet(IDataReader rs,字符串名称) 在 p:\nhibernate-core\src\NHibernate\Type\NullableType.cs:253 行
在 NHibernate.Loader.Custom.CustomLoader.ScalarResultColumnProcessor.Extract(Object[] 数据、IDataReader 结果集、ISessionImplementor 会话)中 p:\nhibernate-core\src\NHibernate\Loader\Custom\CustomLoader.cs:line 458 在 NHibernate.Loader.Custom.CustomLoader.ResultRowProcessor.BuildResultRow(Object[] 数据,IDataReader 结果集,布尔 hasTransformer, ISessionImplementor 会话)中 p:\nhibernate-core\src\NHibernate\Loader\Custom\CustomLoader.cs:line 395 在 NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) in p:\nhibernate-core\src\NHibernate\Loader\Loader.cs:473 行 NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) in p:\nhibernate-core\src\NHibernate\Loader\Loader.cs:第 251 行 NHibernate.Loader.Loader.DoList(ISessionImplementor 会话, 查询参数查询参数)在 p:\nhibernate-core\src\NHibernate\Loader\Loader.cs:line 1564 不能 执行查询 [查询] 在 NHibernate.Loader.Loader.DoList(ISessionImplementor 会话, 查询参数查询参数)在 p:\nhibernate-core\src\NHibernate\Loader\Loader.cs:line 1573 at NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor 会话,QueryParameters 查询参数)在 p:\nhibernate-core\src\NHibernate\Loader\Loader.cs:第 1472 行 NHibernate.Impl.SessionImpl.ListCustomQuery(ICustomQuery customQuery, QueryParameters queryParameters, IList 结果)在 p:\nhibernate-core\src\NHibernate\Impl\SessionImpl.cs:line 2104 at NHibernate.Impl.SessionImpl.List(NativeSQLQuerySpecification 规范, QueryParameters queryParameters, IList 结果)在 p:\nhibernate-core\src\NHibernate\Impl\SessionImpl.cs:line 2091 at NHibernate.Impl.SessionImpl.List[T](NativeSQLQuerySpecification 规范, 查询参数查询参数)在 p:\nhibernate-core\src\NHibernate\Impl\SessionImpl.cs:line 2078 at NHibernate.Impl.SqlQueryImpl.ListT 在 p:\nhibernate-core\src\NHibernate\Impl\SqlQueryImpl.cs:160行
更新: 这是有助于重现问题的简单代码。 TimeValue 在 sql server 中有 'time(0) null' 类型。
ISession session = TransactionScopeManager.Instance.GetSession();
iQuery = session.CreateSQLQuery("select TimeValue from TestTable");
result = iQuery.List();
【问题讨论】:
-
也许你的代码中存在错误?我们无法判断,因为您不显示映射和查询。 :)
-
由于我使用的是 sql 查询,因此不涉及映射。但我添加了演示问题的代码
标签: sql-server nhibernate