【发布时间】:2011-05-17 23:41:16
【问题描述】:
我正在使用 ODP.net 针对 Oracle 10g 数据库运行聚合 AVG。我直接在数据库上运行这个查询,它工作正常:
从 IHObjekt 中选择 avg(ANSCHAFFUNGSKST)
返回:13.4493973163521
HQL 和 CreateCriteria 接口均成功执行查询。我收到 NHibernate '无法执行查询' 消息。但是,我相对确定这是基于 posting 的 ODP.Net 错误。
Oracle 有一个解决方案,只需 TRUNC AVG。但是,TRUNC 命令在 Oracle 和 SQL Server 中是不同的,我需要/不想让我的代码成为特定于数据库的代码。
关于如何减少小数点数以使其适合小数,最重要的是,它适用于所有数据库的任何想法?
来源 = NHibernate
堆栈跟踪
- NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)
- NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters)
- NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces, IType[] resultTypes)
- NHibernate.Hql.Ast.ANTLR.Loader.QueryLoader.List(ISessionImplementor session, QueryParameters queryParameters)
- NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.List(ISessionImplementor session, QueryParameters queryParameters)
- NHibernate.Engine.Query.HQLQueryPlan.PerformList(QueryParameters queryParameters, ISessionImplementor session, IList results)
- NHibernate.Impl.SessionImpl.List(String query, QueryParameters queryParameters, IList results)
- NHibernate.Impl.SessionImpl.List(字符串查询,QueryParameters 参数)
- NHibernate.Impl.QueryImpl.List()
- DBTest_NHibernate.MainWindow.ButtonHQLQuery_Click(Object sender, RoutedEventArgs e) in C:\...
内部异常
[System.OverflowException] = {"Die arithmetische Operation hat einen Überlauf verursacht."} ... 算术运算导致溢出。
来源 = Oracle.DataAccess
堆栈跟踪
- Oracle.DataAccess.Types.DecimalConv.GetDecimal(IntPtr numCtx)
- Oracle.DataAccess.Client.OracleDataReader.GetDecimal(Int32 i)
- Oracle.DataAccess.Client.OracleDataReader.GetValue(Int32 i)
- Oracle.DataAccess.Client.OracleDataReader.get_Item(Int32 i)
- NHibernate.Type.DoubleType.Get(IDataReader rs, Int32 索引)
- NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, 字符串名称)
- NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String[] names, ISessionImplementor session, Object owner)
- NHibernate.Hql.Ast.ANTLR.Loader.QueryLoader.GetResultColumnOrRow(Object[] row, IResultTransformer resultTransformer, IDataReader rs, ISessionImplementor session)
- NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet, ISessionImplementor session, QueryParameters queryParameters, LockMode[] lockModeArray, EntityKey optionalObjectKey, IList hydradObjects, EntityKey[] 键, Boolean returnProxies)
- NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
- NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
- NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)
部分 HQL 测试结果
- 从 IHObjekt 中选择 TRUNC(AVG(ANSCHAFFUNGSKST),27) - WORKS(仅在 ORACLE 中)
- 从 IHObjekt 中选择 TRUNC(AVG(ANSCHAFFUNGSKST),28) - 不起作用
- 从 IHObjekt 中选择 AVG(ANSCHAFFUNGSKST) - 不起作用
NHibernate 生成的 SQL
SELECT
AVG(IHOBJEKT0_.ANSCHAFFUNGSKST) AS COL_0_0_,
COUNT(IHOBJEKT0_.ANSCHAFFUNGSKST) AS COL_1_0_,
MAX(IHOBJEKT0_.ANSCHAFFUNGSKST) AS COL_2_0_,
MIN(IHOBJEKT0_.ANSCHAFFUNGSKST) AS COL_3_0_,
SUM(IHOBJEKT0_.ANSCHAFFUNGSKST) AS COL_4_0_
FROM
IHOBJEKT IHOBJEKT0_
只有 AVG 在使用 ODP.Net 的 Oracle 上的上述 SQL 语句中不起作用。使用 SQL Server 或 Oracle 客户端即可。
【问题讨论】:
-
发布完整的异常,包括堆栈跟踪。
-
能贴出nhiberate生成的查询吗?
标签: nhibernate decimal odp.net average