DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

概述:

     当用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如下:


<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  
<class name="Model.JkptOaxtDictate,Model" table="JKPT_OAXT_DICTATE" lazy="false">
    
<id name="Dictateid" column="DICTATEID" type="Decimal">
      
<generator class="sequence">
        
<param name="sequence">JKPT.OARecordSequence</param>
      
</generator>
    
</id>
    
<property type="Decimal" name="Registerorgid" column="REGISTERORGID" />
    
<property type="string" length="6" name="Registeroperatorid" column="REGISTEROPERATORID" />
    
<property type="DateTime" name="Registertime" column="REGISTERTIME" />
    
<property type="string" length="200" name="Dictatetitle" column="DICTATETITLE" />
    
<property type="string" length="4000" name="Dictatedesc" column="DICTATEDESC" />
    
<property type="Decimal" name="Modifyorgid" column="MODIFYORGID" />
    
<property type="string" length="6" name="Modifyoperatorid" column="MODIFYOPERATORID" />
    
<property type="DateTime" name="Modifytime" column="MODIFYTIME" />
    
<property type="Decimal" name="Isbrowse" column="ISBROWSE" />
    
<property type="Decimal" name="Browseorgid" column="BROWSEORGID" />
    
<property type="string" length="6" name="Browseoperatorid" column="BROWSEOPERATORID" />
    
<property type="DateTime" name="Browsetime" column="BROWSETIME" />
    
<property type="Decimal" name="Informtype" column="INFORMTYPE" />
    
<set name="details"  cascade="all"  inverse="true" lazy="false">
      
<key column="DICTATEID" />
      
<one-to-many class="Model.JkptOaxtDictatedetails,Model"  />      
    
</set>
  
</class>
</hibernate-mapping>

 

  相应的CS如下:


/*
using MyGeneration/Template/NHibernate (c) by Sharp 1.4
based on OHM (alvy77@hotmail.com)
*/
using System;
using System.Collections;
using System.Collections.Generic;

using Iesi.Collections;

namespace Model
{

    
/// <summary>
    
/// IJkptOaxtDictate interface for NHibernate mapped table 'JKPT_OAXT_DICTATE'.
    
/// </summary>
    public interface IJkptOaxtDictate
    {
        
#region Public Properties
        
        
decimal Dictateid
        {
            
get ;
            
set ;
              
        }
        
        
decimal Registerorgid
        {
            
get ;
            
set ;
              
        }
        
        
string Registeroperatorid
        {
            
get ;
            
set ;
              
        }
        
        DateTime Registertime
        {
            
get ;
            
set ;
              
        }
        
        
string Dictatetitle
        {
            
get ;
            
set ;
              
        }
        
        
string Dictatedesc
        {
            
get ;
            
set ;
              
        }
        
        
decimal Modifyorgid
        {
            
get ;
            
set ;
              
        }
        
        
string Modifyoperatorid
        {
            
get ;
            
set ;
              
        }
        
        DateTime Modifytime
        {
            
get ;
            
set ;
              
        }
        
        
decimal Isbrowse
        {
            
get ;
            
set ;
              
        }
        
        
decimal Browseorgid
        {
            
get ;
            
set ;
              
        }
        
        
string Browseoperatorid
        {
            
get ;
            
set ;
              
        }
        
        DateTime Browsetime
        {
            
get ;
            
set ;
              
        }
        
        
decimal Informtype
        {
            
get ;
            
set ;
              
        }
        ISet details
        {
            
get;
            
set;
        }

        
bool IsDeleted { getset; }
        
bool IsChanged { getset; }
        
        
#endregion 
    }

    
/// <summary>
    
/// JkptOaxtDictate object for NHibernate mapped table 'JKPT_OAXT_DICTATE'.
    
/// </summary>
    [Serializable]
    
public class JkptOaxtDictate : ICloneable,IJkptOaxtDictate
    {
        
#region Member Variables

        
protected decimal _dictateid;
        
protected decimal _registerorgid;
        
protected string _registeroperatorid;
        
protected DateTime _registertime;
        
protected string _dictatetitle;
        
protected string _dictatedesc;
        
protected decimal _modifyorgid;
        
protected string _modifyoperatorid;
        
protected DateTime _modifytime;
        
protected decimal _isbrowse;
        
protected decimal _browseorgid;
        
protected string _browseoperatorid;
        
protected DateTime _browsetime;
        
protected decimal _informtype;
        
private ISet _details=new HashedSet();
        
protected bool _bIsDeleted;
        
protected bool _bIsChanged;
        
#endregion
        
        
#region Constructors
        
public JkptOaxtDictate() {}

        
public JkptOaxtDictate(decimal pDictateid, decimal pRegisterorgid, string pRegisteroperatorid, DateTime pRegistertime, string pDictatetitle, string pDictatedesc, decimal pModifyorgid, string pModifyoperatorid, DateTime pModifytime, decimal pIsbrowse, decimal pBrowseorgid, string pBrowseoperatorid, DateTime pBrowsetime, decimal pInformtype)
        {
            
this._dictateid = pDictateid;
            
this._registerorgid = pRegisterorgid;
            
this._registeroperatorid = pRegisteroperatorid;
            
this._registertime = pRegistertime;
            
this._dictatetitle = pDictatetitle;
            
this._dictatedesc = pDictatedesc;
            
this._modifyorgid = pModifyorgid;
            
this._modifyoperatorid = pModifyoperatorid;
            
this._modifytime = pModifytime;
            
this._isbrowse = pIsbrowse;
            
this._browseorgid = pBrowseorgid;
            
this._browseoperatorid = pBrowseoperatorid;
            
this._browsetime = pBrowsetime;
            
this._informtype = pInformtype;          

        }
        
        
public JkptOaxtDictate(decimal pDictateid)
        {
            
this._dictateid = pDictateid; 
        }
        
        
#endregion
        
        
#region Public Properties
        
        
public decimal Dictateid
        {
            
get { return _dictateid; }
            
set { _bIsChanged |= (_dictateid != value); _dictateid = value; }
            
        }
        
        
public decimal Registerorgid
        {
            
get { return _registerorgid; }
            
set { _bIsChanged |= (_registerorgid != value); _registerorgid = value; }
            
        }
        
        
public string Registeroperatorid
        {
            
get { return _registeroperatorid; }
            
set 
            {
              
if (value != null && value.Length > 6)
                
throw new ArgumentOutOfRangeException("Registeroperatorid""Registeroperatorid value, cannot contain more than 6 characters");
              _bIsChanged 
|= (_registeroperatorid != value); 
              _registeroperatorid 
= value; 
            }
            
        }
        
        
public DateTime Registertime
        {
            
get { return _registertime; }
            
set { _bIsChanged |= (_registertime != value); _registertime = value; }
            
        }
        
        
public string Dictatetitle
        {
            
get { return _dictatetitle; }
            
set 
            {
              
if (value != null && value.Length > 200)
                
throw new ArgumentOutOfRangeException("Dictatetitle""Dictatetitle value, cannot contain more than 200 characters");
              _bIsChanged 
|= (_dictatetitle != value); 
              _dictatetitle 
= value; 
            }
            
        }
        
        
public string Dictatedesc
        {
            
get { return _dictatedesc; }
            
set 
            {
              
if (value != null && value.Length > 4000)
                
throw new ArgumentOutOfRangeException("Dictatedesc""Dictatedesc value, cannot contain more than 4000 characters");
              _bIsChanged 
|= (_dictatedesc != value); 
              _dictatedesc 
= value; 
            }
            
        }
        
        
public decimal Modifyorgid
        {
            
get { return _modifyorgid; }
            
set { _bIsChanged |= (_modifyorgid != value); _modifyorgid = value; }
            
        }
        
        
public string Modifyoperatorid
        {
            
get { return _modifyoperatorid; }
            
set 
            {
              
if (value != null && value.Length > 6)
                
throw new ArgumentOutOfRangeException("Modifyoperatorid""Modifyoperatorid value, cannot contain more than 6 characters");
              _bIsChanged 
|= (_modifyoperatorid != value); 
              _modifyoperatorid 
= value; 
            }
            
        }
        
        
public DateTime Modifytime
        {
            
get { return _modifytime; }
            
set { _bIsChanged |= (_modifytime != value); _modifytime = value; }
            
        }
        
        
public decimal Isbrowse
        {
            
get { return _isbrowse; }
            
set { _bIsChanged |= (_isbrowse != value); _isbrowse = value; }
            
        }
        
        
public decimal Browseorgid
        {
            
get { return _browseorgid; }
            
set { _bIsChanged |= (_browseorgid != value); _browseorgid = value; }
            
        }
        
        
public string Browseoperatorid
        {
            
get { return _browseoperatorid; }
            
set 
            {
              
if (value != null && value.Length > 6)
                
throw new ArgumentOutOfRangeException("Browseoperatorid""Browseoperatorid value, cannot contain more than 6 characters");
              _bIsChanged 
|= (_browseoperatorid != value); 
              _browseoperatorid 
= value; 
            }
            
        }
        
        
public DateTime Browsetime
        {
            
get { return _browsetime; }
            
set { _bIsChanged |= (_browsetime != value); _browsetime = value; }
            
        }
        
        
public decimal Informtype
        {
            
get { return _informtype; }
            
set { _bIsChanged |= (_informtype != value); _informtype = value; }
            
        }
        
public ISet details
        {
            
get { return _details; }
            
set { this._details = value; }
        }

        
public bool IsDeleted
        {
            
get
            {
                
return _bIsDeleted;
            }
            
set
            {
                _bIsDeleted 
= value;
            }
        }
        
        
public bool IsChanged
        {
            
get
            {
                
return _bIsChanged;
            }
            
set
            {
                _bIsChanged 
= value;
            }
        }
        
        
#endregion 
        
#region ICloneable methods
        
        
public object Clone()
        {
            
return this.MemberwiseClone();
        }
        
        
#endregion
    }
    
    
#region Custom ICollection interface for JkptOaxtDictate 

    
    
public interface IJkptOaxtDictateCollection : ICollection
    {
        JkptOaxtDictate 
this[int index]{    getset; }
        
void Add(JkptOaxtDictate pJkptOaxtDictate);
        
void Clear();
    }
    
    [Serializable]
    
public class JkptOaxtDictateCollection : IJkptOaxtDictateCollection
    {
        
private IList<JkptOaxtDictate> _arrayInternal;

        
public JkptOaxtDictateCollection()
        {
            _arrayInternal 
= new List<JkptOaxtDictate>();
        }
        
        
public JkptOaxtDictateCollection( IList<JkptOaxtDictate> pSource )
        {
            _arrayInternal 
= pSource;
            
if(_arrayInternal == null)
            {
                _arrayInternal 
= new List<JkptOaxtDictate>();
            }
        }

        
public JkptOaxtDictate this[int index]
        {
            
get
            {
                
return _arrayInternal[index];
            }
            
set
            {
                _arrayInternal[index] 
= value;
            }
        }

        
public int Count { get { return _arrayInternal.Count; } }
        
public bool IsSynchronized { get { return false; } }
        
public object SyncRoot { get { return _arrayInternal; } }
        
public void CopyTo(Array array, int index){ _arrayInternal.CopyTo((JkptOaxtDictate[])array, index); }
        
public IEnumerator GetEnumerator() { return _arrayInternal.GetEnumerator(); }
        
public void Add(JkptOaxtDictate pJkptOaxtDictate) { _arrayInternal.Add(pJkptOaxtDictate); }
        
public void Clear() { _arrayInternal.Clear(); }
        
public IList<JkptOaxtDictate> GetList() { return _arrayInternal; }
     }
    
    
#endregion
}

 

从表xml如下:


<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  
<class name="Model.JkptOaxtDictatedetails,Model" table="JKPT_OAXT_DICTATEDETAILS" lazy="false">
    
<id name="Dictatedetailsid" column="DICTATEDETAILSID" type="Decimal" unsaved-value="0">
      
<generator class="sequence">
        
<param name="sequence">JKPT.OARecordSequence</param>
      
</generator>
    
</id>
    
<property type="Decimal" name="Dictateid" column="DICTATEID" />
    
<property type="Decimal" name="Targetorgid" column="TARGETORGID" />
    
<property type="Decimal" name="Sign" column="SIGN" />
    
<many-to-one name="dictate" column="DICTATEID" class="Model.JkptOaxtDictate,Model"/>
  
</class>
</hibernate-mapping>

 

相应的CS如下:


/*
using MyGeneration/Template/NHibernate (c) by Sharp 1.4
based on OHM (alvy77@hotmail.com)
*/
using System;
using System.Collections;
using System.Collections.Generic;

namespace Model
{

    
/// <summary>
    
/// IJkptOaxtDictatedetails interface for NHibernate mapped table 'JKPT_OAXT_DICTATEDETAILS'.
    
/// </summary>
    public interface IJkptOaxtDictatedetails
    {
        
#region Public Properties
        
        
decimal Dictatedetailsid
        {
            
get ;
            
set ;
              
        }
        
        
decimal Dictateid
        {
            
get ;
            
set ;
              
        }
        
        
decimal Targetorgid
        {
            
get ;
            
set ;
              
        }
        
        
decimal Sign
        {
            
get ;
            
set ;
              
        }
        JkptOaxtDictate dictate
        {
            
get;
            
set;
        }
        
bool IsDeleted { getset; }
        
bool IsChanged { getset; }
        
        
#endregion 
    }

    
/// <summary>
    
/// JkptOaxtDictatedetails object for NHibernate mapped table 'JKPT_OAXT_DICTATEDETAILS'.
    
/// </summary>
    [Serializable]
    
public class JkptOaxtDictatedetails : ICloneable,IJkptOaxtDictatedetails
    {
        
#region Member Variables

        
protected decimal _dictatedetailsid;
        
protected decimal _dictateid;
        
protected decimal _targetorgid;
        
protected decimal _sign;
        
protected JkptOaxtDictate _dictate;
        
protected bool _bIsDeleted;
        
protected bool _bIsChanged;
        
#endregion
        
        
#region Constructors
        
public JkptOaxtDictatedetails() {}
        
        
public JkptOaxtDictatedetails(decimal pDictatedetailsid, decimal pDictateid, decimal pTargetorgid, decimal pSign)
        {
            
this._dictatedetailsid = pDictatedetailsid; 
            
this._dictateid = pDictateid; 
            
this._targetorgid = pTargetorgid; 
            
this._sign = pSign; 
        }
        
        
public JkptOaxtDictatedetails(decimal pDictatedetailsid)
        {
            
this._dictatedetailsid = pDictatedetailsid; 
        }
        
        
#endregion
        
        
#region Public Properties
        
        
public decimal Dictatedetailsid
        {
            
get { return _dictatedetailsid; }
            
set { _bIsChanged |= (_dictatedetailsid != value); _dictatedetailsid = value; }
            
        }
        
        
public decimal Dictateid
        {
            
get { return _dictateid; }
            
set { _bIsChanged |= (_dictateid != value); _dictateid = value; }
            
        }
        
        
public decimal Targetorgid
        {
            
get { return _targetorgid; }
            
set { _bIsChanged |= (_targetorgid != value); _targetorgid = value; }
            
        }
        
        
public decimal Sign
        {
            
get { return _sign; }
            
set { _bIsChanged |= (_sign != value); _sign = value; }
            
        }
        
public JkptOaxtDictate dictate
        {
            
get {
               
                
return _dictate;
            }
            
set { this._dictate = value; }
        }

        
public bool IsDeleted
        {
            
get
            {
                
return _bIsDeleted;
            }
            
set
            {
                _bIsDeleted 
= value;
            }
        }
        
        
public bool IsChanged
        {
            
get
            {
                
return _bIsChanged;
            }
            
set
            {
                _bIsChanged 
= value;
            }
        }
        
        
#endregion 
        
#region ICloneable methods
        
        
public object Clone()
        {
            
return this.MemberwiseClone();
        }
        
        
#endregion
    }
    
    
#region Custom ICollection interface for JkptOaxtDictatedetails 

    
    
public interface IJkptOaxtDictatedetailsCollection : ICollection
    {
        JkptOaxtDictatedetails 
this[int index]{    getset; }
        
void Add(JkptOaxtDictatedetails pJkptOaxtDictatedetails);
        
void Clear();
    }
    
    [Serializable]
    
public class JkptOaxtDictatedetailsCollection : IJkptOaxtDictatedetailsCollection
    {
        
private IList<JkptOaxtDictatedetails> _arrayInternal;

        
public JkptOaxtDictatedetailsCollection()
        {
            _arrayInternal 
= new List<JkptOaxtDictatedetails>();
        }
        
        
public JkptOaxtDictatedetailsCollection( IList<JkptOaxtDictatedetails> pSource )
        {
            _arrayInternal 
= pSource;
            
if(_arrayInternal == null)
            {
                _arrayInternal 
= new List<JkptOaxtDictatedetails>();
            }
        }

        
public JkptOaxtDictatedetails this[int index]
        {
            
get
            {
                
return _arrayInternal[index];
            }
            
set
            {
                _arrayInternal[index] 
= value;
            }
        }

        
public int Count { get { return _arrayInternal.Count; } }
        
public bool IsSynchronized { get { return false; } }
        
public object SyncRoot { get { return _arrayInternal; } }
        
public void CopyTo(Array array, int index){ _arrayInternal.CopyTo((JkptOaxtDictatedetails[])array, index); }
        
public IEnumerator GetEnumerator() { return _arrayInternal.GetEnumerator(); }
        
public void Add(JkptOaxtDictatedetails pJkptOaxtDictatedetails) { _arrayInternal.Add(pJkptOaxtDictatedetails); }
        
public void Clear() { _arrayInternal.Clear(); }
        
public IList<JkptOaxtDictatedetails> GetList() { return _arrayInternal; }
     }
    
    
#endregion
}

 

主程序如下:

 

 


 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"

posted on 2011-10-11 12:46  DoubleLi  阅读(3725)  评论(0编辑  收藏