您的位置:首页 > 数据库 > Oracle

此OracleParameterCollection 的 Count=4 的索引 4 无效 的解决办法 NHibernate

2011-10-11 12:46 627 查看
概述:

当用Nhibernate操作主从表时,往主表插入数据时,当执行到提交事务时出现如下错误:

此 OracleParameterCollection 的 Count=4 的索引 4 无效。

在 System.Data.OracleClient.OracleParameterCollection.RangeCheck(Int32 index) 在 System.Data.OracleClient.OracleParameterCollection.GetParameter(Int32 index) 在 System.Data.Common.DbParameterCollection.System.Collections.IList.get_Item(Int32 index) 在 NHibernate.Type.DecimalType.Set(IDbCommand st, Object value, Int32 index) 在 NHibernate.Type.NullableType.NullSafeSet(IDbCommand cmd, Object value, Int32 index) 在 NHibernate.Type.NullableType.NullSafeSet(IDbCommand st, Object value, Int32 index, ISessionImplementor session) 在 NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id, Object[] fields, Object rowId, Boolean[] includeProperty, Boolean[][] includeColumns, Int32 table, IDbCommand statement, ISessionImplementor session, Int32 index) 在 NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessionImplementor session) 在 NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Object obj, ISessionImplementor session) 在 NHibernate.Action.EntityInsertAction.Execute() 在 NHibernate.Engine.ActionQueue.Execute(IExecutable executable) 在 NHibernate.Engine.ActionQueue.ExecuteActions(IList list) 在 NHibernate.Engine.ActionQueue.ExecuteActions() 在 NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session) 在 NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event) 在 NHibernate.Impl.SessionImpl.Flush() 在 NHibernate.Transaction.AdoTransaction.Commit() 在 DataAccess.DictateDao.AddRecord(String registerOrgid, String registerOperatorid, String dictateTitle, String dictateContent, String dictateType, String[] informOrgid, String[] accessoryName, String[] accessorySize) 位置 D:\OA\DataAccess\DataAccess\DictateDao.cs:行号 64

主表xml如下:

Code
public static bool AddRecord(string registerOrgid, string registerOperatorid, string dictateTitle, string dictateContent, string dictateType, string[] informOrgid, string[] accessoryName, string[] accessorySize)
{
bool IsSuccess = false;
string dictateID ="";
JkptOaxtDictate od = new JkptOaxtDictate();
JkptOaxtDictatedetails detail = new JkptOaxtDictatedetails();

ITransaction trans = session.BeginTransaction();

try
{

od.Registerorgid = decimal.Parse(registerOrgid);
od.Registeroperatorid = registerOperatorid;
od.Registertime = DateTime.Now.ToLocalTime();
od.Dictatetitle = dictateTitle;
od.Dictatedesc = dictateContent;
od.Informtype = decimal.Parse(dictateType);
od.Modifytime = DateTime.Now.ToLocalTime();
od.Browsetime = DateTime.Now.ToLocalTime();

for (int i = 0; i < informOrgid.Length; i++)
{

detail.Dictateid = decimal.Parse("3");
detail.Targetorgid = decimal.Parse(informOrgid[i]);
detail.Sign = 0;
detail.dictate = od;
od.details.Add(detail);
session.Save(od);

}

trans.Commit();

//写日志
Helpers.SaveInfo("Insert dictate 's infomation Success!");
IsSuccess = true;
}
catch (Exception ex)
{
IsSuccess = false;

trans.Rollback();

//写日志
Helpers.SaveInfo("插入失败!错误提示如下:" + ex.Message);
}
finally
{
if (session != null)
{
session.Clear();
}
}
return IsSuccess;
}

当执行到trans.Commit()时出现如上所述错误.

解决办法:

原因是:

从表关联主表时的问题.
<many-to-one name="dictate" column="DICTATEID" class="Model.JkptOaxtDictate,Model"/>

修改为:<many-to-one name="dictate" column="DICTATEID" class="Model.JkptOaxtDictate,Model" insert="false" update="false"/>

即添加属性insert="false" update="false"

if ($ != jQuery) {
$ = jQuery.noConflict();
}
var isLogined = false;
var cb_blogId = 28099;
var cb_entryId = 1427403;
var cb_blogApp = "abcdwxc";
var cb_blogUserGuid = "d8793d0b-63cf-dd11-9e4d-001cf0cd104b";
var cb_entryCreatedDate = '2009/4/1 17:32:00';
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐