NHibernate System.IndexOutOfRangeException
我有一个非常简单的类,它给出了一个奇怪的错误。该类只有1个属性,查询非常简单。最令人窒息的是,这似乎是随机发生的。出现此错误后,通常刷新页面会使页面运行正常,应用程序不会再次收到错误 这可能是数据库连接的问题吗 我得到:NHibernate System.IndexOutOfRangeException,nhibernate,Nhibernate,我有一个非常简单的类,它给出了一个奇怪的错误。该类只有1个属性,查询非常简单。最令人窒息的是,这似乎是随机发生的。出现此错误后,通常刷新页面会使页面运行正常,应用程序不会再次收到错误 这可能是数据库连接的问题吗 我得到: [IndexOutOfRangeException: Department5_] System.Data.ProviderBase.FieldNameLookup.GetOrdinal(String fieldName) +4839010 System.Data.S
[IndexOutOfRangeException: Department5_]
System.Data.ProviderBase.FieldNameLookup.GetOrdinal(String fieldName) +4839010
System.Data.SqlClient.SqlDataReader.GetOrdinal(String name) +67
NHibernate.Driver.NHybridDataReader.GetOrdinal(String name) +46
NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String name) +87
NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String[] names, ISessionImplementor session, Object owner) +62
NHibernate.Loader.Loader.GetKeyFromResultSet(Int32 i, IEntityPersister persister, Object id, IDataReader rs, ISessionImplementor session) +213
NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet, ISessionImplementor session, QueryParameters queryParameters, LockMode[] lockModeArray, EntityKey optionalObjectKey, IList hydratedObjects, EntityKey[] keys, Boolean returnProxies) +301
NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) +1422
NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) +114
NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) +205
[ADOException: could not execute query
[ select department0_.Department as Department5_ from tblDepartments department0_ where department0_.Department like 'CBS - %' ]
[SQL: select department0_.Department as Department5_ from tblDepartments department0_ where department0_.Department like 'CBS - %']]
NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) +383
NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters) +52
NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces, IType[] resultTypes) +183
NHibernate.Hql.Ast.ANTLR.Loader.QueryLoader.List(ISessionImplementor session, QueryParameters queryParameters) +102
NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.List(ISessionImplementor session, QueryParameters queryParameters) +684
NHibernate.Engine.Query.HQLQueryPlan.PerformList(QueryParameters queryParameters, ISessionImplementor session, IList results) +816
NHibernate.Impl.SessionImpl.List(String query, QueryParameters queryParameters, IList results) +277
NHibernate.Impl.SessionImpl.List(String query, QueryParameters parameters) +235
NHibernate.Impl.QueryImpl.List() +224
DispatchBoard.Models.Repository.Find(String hql) +76
DispatchBoard.Controllers.HomeController.Filter() +48
lambda_method(ExecutionScope , ControllerBase , Object[] ) +39
System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +17
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +178
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +24
System.Web.Mvc.<>c__DisplayClassa.<InvokeActionMethodWithFilters>b__7() +52
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +254
System.Web.Mvc.<>c__DisplayClassc.<InvokeActionMethodWithFilters>b__9() +19
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +192
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +399
System.Web.Mvc.Controller.ExecuteCore() +126
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +27
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +7
System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext) +151
System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext) +57
System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext) +7
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75
hbm文件
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="DispatchBoard.Models.Department, DispatchBoard" table="tblDepartments">
<id name="Name" column="Department" type="String" length="50">
<generator class="assigned" />
</id>
</class>
</hibernate-mapping>
这是HQL查询
var hql = "from Department d where d.Name like 'CBS - %'";
_session.CreateQuery(hql).List<T>();
var hql=“来自d部门,其中d.名称类似于'CBS-%”;
_CreateQuery(hql.List();
通常,当您在NHibernate中获得一个IndexOutOfRangeException
时,这是因为您将一个属性映射了两次,或者将两个属性映射到同一列。检查列名
这可能是随机发生的,因为冲突只出现在特定的数据星座中。您在映射文件中输入了长度=50,是否确定数据库列为varchar(50),如果NHibernate获取的字符串较长,则可能会导致错误。我通常会忽略长度属性。我们和其他人最近和过去也遇到过这个问题。它似乎与对非线程安全的
SqlConnection
的多线程访问有关。下面的非常长(!)文章包含了更多的例子和关于这个问题的更多细节:。bbzippo说:
“很明显,SqlDataReader读取
从
上一个查询在同一个数据库上执行
几秒钟前就接通了。”
不幸的是,我还没有找到任何真正的解释来解释为什么这个异常会在一段时间以来一直正常工作的代码中突然发生
在给定线程中提出的一些建议包括:
“数据源=Sql2005;初始目录=MyDbName;用户Id=MyLogin;密码=MyPass;池=false”
(这很可能意味着您的应用程序的性能受到了影响,但肯定会起作用)SqlConnection
实例的所有静态
代码重构为非静态
SqlConnection
s的可能多线程访问(这可能不是那么容易…)附:这是我对的回答的副本。我花了将近3年的时间来追踪我们系统(不使用nHibernate)中GetOrdinal错误的原因。对我们来说,在连接字符串中添加“inclist=False”使问题完全消失。我们已经从每天大约160个错误(大部分是GetOrdinal错误)到昨天的26个错误,而不是一个GetOrdinal错误 显然,Enlist参数(默认情况下为True)告诉ADO将连接分组并作为单个事务进行原子处理,但它似乎不起作用。我们的代码中完全没有事务处理指令,但ADO正在对连接进行分组,并在数据中导致意外结果 如果您的代码中没有处理SQL事务,请尝试此设置,您可能会得到与我们一样的积极结果
Mike当我试图将空值映射到不可为空的属性(即整数)时,我遇到了这个错误。确保sql值不可为null,或者只使c#属性为null(
public virtual int?NumberOfPoints{get;set;}
)如果列名称和映射属性名称不正确匹配,系统通常会引发IndexOutOfRangeException异常。我曾与一个非常类似的错误斗争过一段时间。我从使用Session.CreateSQLQuery(字符串)创建的“原生SQL”查询中得到错误。我以前曾成功地使用过类似的查询,但这次的问题是,我查询的实体类型确实有子类,并且它们在数据库中映射为每个类的表
我注意到,如果我做一个普通的查询,让NHibernate生成SQL,它将包含一个列,格式类似“case when subclass_table.Parent_class_id不为null,那么1 when Parent_class.id不为null,那么0以clazz_结尾”
因此,在修复之前,我的查询是这样的:
SELECT TOP 1 *
FROM Table WITH (TABLOCKX)
WHERE Column = 'Value'
(强制独占表锁是我首先使用“本机SQL”进行查询的原因…)
我所做的只是添加了一个名为“clazz_”的专栏,它就开始工作了。在这种情况下,我确信结果不会包含子类的实例,所以我只是将值硬编码为零:
SELECT TOP 1 *, 0 as clazz_
FROM Table WITH (TABLOCKX)
WHERE Column = 'Value'
如果结果可能包含子类的实例,这将更加复杂。然后,我可能真的必须为子类的表包含左外部联接,以及NHibernate使用它的方式中的CASE子句。谢谢您的建议。查询指向一个只有1个属性(名称)且没有关系的类。如果刷新页面(再次运行查询),它将正常工作。它每次都得到相同的数据。此查询没有任何变体。在上面的hbm文件中,我只定义了id映射。它没有映射两次。我用另一种方式弄乱了我的映射属性。你的评论为我指明了正确的方向。谢谢就我而言,我不是公关
SELECT TOP 1 *, 0 as clazz_
FROM Table WITH (TABLOCKX)
WHERE Column = 'Value'