参数指标超出范围 [英] Parameter index is out of range

查看:344
本文介绍了参数指标超出范围的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图更新使用NHibernate的对象时收到以下错误。我尝试更新的字段是一个外键。任何想法,为什么我可能会得到这个错误?我无法从错误看着办吧,我的log4net的日志没有给出任何暗示无论是。



感谢

  System.IndexOutOfRangeException是由用户代码
消息=未处理的参数指标超出范围。
来源=MySql.Data
堆栈跟踪:
在MySql.Data.MySqlClient.MySqlParameterCollection.CheckIndex(的Int32指数)
在MySql.Data.MySqlClient.MySqlParameterCollection.GetParameter( INT32指数)
在System.Data.Common.DbParameterCollection.System.Collections.IList.get_Item(INT32指数)在NHibernate.Type.Int32Type.Set
(IDbCommand的RS,对象的值,INT32指数)
。在NHibernate.Type.NullableType.NullSafeSet(IDbCommand的CMD,对象的值,指数的Int32)
在NHibernate.Type.NullableType.NullSafeSet(IDbCommand的ST,对象的值,指数的Int32,ISessionImplementor会话)
在NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(对象ID,对象[]字段,对象ROWID,布尔[] includeProperty,布尔[] [] includeColumns,的Int32表,IDbCommand的说法,ISessionImplementor会话的Int32指数)
在NHibernate.Persister.Entity.AbstractEntityPersister.Update(对象ID,对象[]字段,对象[] oldFields,对象ROWID,布尔[] includeProperty,的Int32Ĵ,对象oldVersion,obj对象,SqlCommandInfo SQL,ISessionImplementor会话)
。在NHibernate.Persister.Entity.AbstractEntityPersister.UpdateOrInsert(对象ID,对象[]字段,对象[] oldFields,对象ROWID,布尔[] includeProperty,的Int32Ĵ,对象oldVersion,obj对象,SqlCommandInfo SQL,ISessionImplementor会话)$ b在NHibernate.Persister.Entity.AbstractEntityPersister.Update $ b(对象ID,对象[]字段的Int32 [] dirtyFields,布尔hasDirtyCollection,对象[] oldFields,对象oldVersion,obj对象,对象ROWID,ISessionImplementor会话)
在NHibernate.Action.EntityUpdateAction.Execute()
在NHibernate.Engine.ActionQueue.Execute(IExecutable可执行文件)
在NHibernate.Engine.ActionQueue.ExecuteActions(IList的列表)
在NHibernate.Engine .ActionQueue.ExecuteActions()在NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource会议)
在NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent事件)
。在NHibernate.Impl
.SessionImpl.Flush()
在NHibernate.Transaction.AdoTransaction.Commit()
在DataAccessLayer.NHibernateDataProvider.UpdateItem_temp(items_temp item_temp)在C:\Documents和Settings\user\My Documents\\ \\Visual工作室2008\Projects\mySolution\DataAccessLayer\NHibernateDataProvider.cs:在C线225
在InventoryDataClean.Controllers.ImportController.Edit(的Int32 ID,的FormCollection formValues):\Documents和Settings\ user\My Documents\Visual工作室2008\Projects\mySolution\InventoryDataClean\Controllers\ImportController.cs:行101
在lambda_method(ExecutionScope,ControllerBase,对象[])
。在System.Web.Mvc.ActionMethodDispatcher.Execute在System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerBase控制器,对象[]参数)
(controllerContext controllerContext,IDictionary`2参数)
在System.Web程序。 Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext,ActionDescriptor actionDescriptor,IDictionary`2参数)
在System.Web.Mvc.ControllerActionInvoker<>< c__DisplayClassa。InvokeActionMethodWithFilters>对于系统b__7()
。 Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter过滤器,ActionExecutingContext preContext,Func`1续)
的InnerException:

下面是我的项目的映射 -

 <?XML版本=1.0编码=UTF-8 ?> 
<休眠映射的xmlns =金塔:NHibernate的映射 - 2.2集结号=DataTransfer命名空间=DataTransfer>
<类名=DataTransfer.items_temp,DataTransfer表=items_temp>
< ID名称=ID未保存值=任何>
<生成器类=分配/>
< / ID>
<属性名=由assetid/>
<属性名=说明/>
<属性名=看守/>
<属性名=类别/>
<属性名=身份/>
<属性名=供应商/>

<多到一个名称=statusName级=状态栏=状态/>
< /班>
< /休眠映射>

下面是我的状态映射 -

 <?XML版本=1.0编码=UTF-8>?; 
<休眠映射的xmlns =金塔:NHibernate的映射 - 2.2集结号=DataTransfer命名空间=DataTransfer>
<类名=DataTransfer.status,DataTransfer表=状态>
< ID名称=ID未保存值=0>
<生成器类=分配/>
< / ID>
<属性名=名/>
<属性名=高清/>

< /班>
< /休眠映射>

和这里是我的更新功能 -

 公共无效UpdateItem_temp(items_temp item_temp)
{
ITransaction T = _session.BeginTransaction();

{
_session.SaveOrUpdate(item_temp);
t.Commit();
}
赶上(例外)
{
t.Rollback();
抛出;
}
终于
{
t.Dispose();
}
}


解决方案

您映射 items_temp.status 两次 - 一次作为一个属性一次作为多对多。酮参考

 <属性名=身份/> 
<多到一个名称=statusName级=状态栏=状态/>

如果你想做到这一点,你需要改变其中之一的列名。


I am getting the following error when trying to update an object using nhibernate. I am attempting to update a field which is a foreign key. Any thoughts why I might be getting this error? I can't figure it out from that error and my log4net log doesn't give any hints either.

Thanks

    System.IndexOutOfRangeException was unhandled by user code
  Message="Parameter index is out of range."
  Source="MySql.Data"
  StackTrace:
       at MySql.Data.MySqlClient.MySqlParameterCollection.CheckIndex(Int32 index)
       at MySql.Data.MySqlClient.MySqlParameterCollection.GetParameter(Int32 index)
       at System.Data.Common.DbParameterCollection.System.Collections.IList.get_Item(Int32 index)
       at NHibernate.Type.Int32Type.Set(IDbCommand rs, Object value, Int32 index)
       at NHibernate.Type.NullableType.NullSafeSet(IDbCommand cmd, Object value, Int32 index)
       at NHibernate.Type.NullableType.NullSafeSet(IDbCommand st, Object value, Int32 index, ISessionImplementor session)
       at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id, Object[] fields, Object rowId, Boolean[] includeProperty, Boolean[][] includeColumns, Int32 table, IDbCommand statement, ISessionImplementor session, Int32 index)
       at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session)
       at NHibernate.Persister.Entity.AbstractEntityPersister.UpdateOrInsert(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session)
       at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Int32[] dirtyFields, Boolean hasDirtyCollection, Object[] oldFields, Object oldVersion, Object obj, Object rowId, ISessionImplementor session)
       at NHibernate.Action.EntityUpdateAction.Execute()
       at NHibernate.Engine.ActionQueue.Execute(IExecutable executable)
       at NHibernate.Engine.ActionQueue.ExecuteActions(IList list)
       at NHibernate.Engine.ActionQueue.ExecuteActions()
       at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session)
       at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event)
       at NHibernate.Impl.SessionImpl.Flush()
       at NHibernate.Transaction.AdoTransaction.Commit()
       at DataAccessLayer.NHibernateDataProvider.UpdateItem_temp(items_temp item_temp) in C:\Documents and Settings\user\My Documents\Visual Studio 2008\Projects\mySolution\DataAccessLayer\NHibernateDataProvider.cs:line 225
       at InventoryDataClean.Controllers.ImportController.Edit(Int32 id, FormCollection formValues) in C:\Documents and Settings\user\My Documents\Visual Studio 2008\Projects\mySolution\InventoryDataClean\Controllers\ImportController.cs:line 101
       at lambda_method(ExecutionScope , ControllerBase , Object[] )
       at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
       at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
       at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
       at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassa.<InvokeActionMethodWithFilters>b__7()
       at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
  InnerException: 

Here is my item mapping -

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DataTransfer" namespace="DataTransfer">
  <class name="DataTransfer.items_temp, DataTransfer" table="items_temp">
    <id name="id" unsaved-value="any" >
      <generator class="assigned"/>
    </id>
    <property name="assetid"/>
    <property name="description"/>
    <property name="caretaker"/>
    <property name="category"/>
    <property name="status"  />
    <property name="vendor" />

    <many-to-one name="statusName" class="status" column="status" />
  </class>
</hibernate-mapping>

Here is my status mapping -

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DataTransfer" namespace="DataTransfer">
  <class name="DataTransfer.status, DataTransfer" table="status">
    <id name="id" unsaved-value="0">
      <generator class="assigned"/>
    </id>
    <property name="name"/>
    <property name="def"/>

  </class>
</hibernate-mapping>

and here is my update function -

public void UpdateItem_temp(items_temp item_temp)
        {
            ITransaction t = _session.BeginTransaction();
            try
            {
                _session.SaveOrUpdate(item_temp);
                t.Commit();
            }
            catch (Exception)
            {
                t.Rollback();
                throw;
            }
            finally
            {
                t.Dispose();
            }
        }

解决方案

You mapped the items_temp.status twice - once as a property and once as a many-to-one reference.

<property name="status"  />
<many-to-one name="statusName" class="status" column="status" />

If you want to do this, you need to change the column name of one of these.

这篇关于参数指标超出范围的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆