2012-01-24 4 views
0

XDocument 특성 유형을 Oracle XMLType으로 맵핑하는 가장 좋은 방법을 찾고 있습니까? 레거시 데이터베이스에 매핑 중이며 스키마를 제어 할 수 없습니다. 오라클 9i입니다.Fluent NHibernate Oracle XMLType에 XDocument 특성 매핑

이 버전 3의 nHibernate가이 유형의 매핑을위한 박스 기능을 제공한다는 것을 읽었습니다. 나는 유창한 매핑으로 버전 3.1을 사용하고와 생성의 기본 맵을 사용할 때 다음과 같은 오류가 나타날 수 있습니다

:

System.ArgumentOutOfRangeException : Specified argument was out of the range of valid values. at Oracle.DataAccess.Client.OracleParameter.set_DbType(DbType value) at NHibernate.Driver.DriverBase.SetCommandParameters(IDbCommand cmd, SqlType[] sqlTypes) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Driver\DriverBase.cs: line 180 at NHibernate.Driver.DriverBase.GenerateCommand(CommandType type, SqlString sqlString, SqlType[] parameterTypes) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Driver\DriverBase.cs: line 136 at NHibernate.AdoNet.AbstractBatcher.Generate(CommandType type, SqlString sqlString, SqlType[] parameterTypes) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\AdoNet\AbstractBatcher.cs: line 78 at NHibernate.AdoNet.AbstractBatcher.PrepareBatchCommand(CommandType type, SqlString sql, SqlType[] parameterTypes) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\AdoNet\AbstractBatcher.cs: line 146 at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessionImplementor session) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs: line 2616 at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Object obj, ISessionImplementor session) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs: line 3050 at NHibernate.Action.EntityInsertAction.Execute() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Action\EntityInsertAction.cs: line 59 at NHibernate.Engine.ActionQueue.Execute(IExecutable executable) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs: line 136 at NHibernate.Engine.ActionQueue.ExecuteActions(IList list) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs: line 125 at NHibernate.Engine.ActionQueue.ExecuteActions() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs: line 170 at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\AbstractFlushingEventListener.cs: line 241 at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\DefaultFlushEventListener.cs: line 20 at NHibernate.Impl.SessionImpl.Flush() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\SessionImpl.cs: line 1470

은 내가하여 XDocument와 문자열 사이의 변환 내 자신의 사용자 유형을 작성하는이 둘레에 있어요

public SqlType[] SqlTypes 
{ 
get { return (new SqlType[] { new StringClobSqlType() }); } 
} 

public Type ReturnedType 
{ 
get { return (typeof(XDocument)); } 
} 

public object NullSafeGet(IDataReader rs, string[] names, object owner) 
{ 
XDocument xDoc = null; 

int columnIndex = rs.GetOrdinal(names[0]); 
if (!rs.IsDBNull(columnIndex)) 
{ 
xDoc = XDocument.Parse((rs[columnIndex].ToString())); 
} 

return (xDoc); 
} 

public void NullSafeSet(IDbCommand cmd, object value, int index) 
{ 
IDbDataParameter parameter = (IDbDataParameter)cmd.Parameters[index]; 

if (value == null) 
{ 
parameter.Value = DBNull.Value; 
} 
else 
{ 
XDocument xDoc = (XDocument)value; 
parameter.Value = xDoc.ConvertToString(); 

} 
} 

문자열이 4000자를 초과 할 때까지 정상적으로 작동합니다. 지금은 오류를 얻을 :

NHibernate.Exceptions.GenericADOException : could not insert: [XmlBlob#95586][SQL: INSERT INTO XMLBLOB (CAT_CODE, BLB_BLOB, BLB_ID) VALUES (?, ?, ?)] ----> Oracle.DataAccess.Client.OracleException : ORA-01461: can bind a LONG value only for insert into a LONG column

답변

0

나는로 XMLType 컬럼에 4000 개 이상의 문자를 저장할 수 필요한 유일한 업데이트는 내 사용자 유형의 구현을위한 설정 방법에 OracleDbType.XmlType으로 매개 변수 유형을 설정하는 것이 었습니다 :

public void NullSafeSet(IDbCommand cmd, object value, int index) 
    { 
     IDbDataParameter parameter = (IDbDataParameter)cmd.Parameters[index]; 
     ((OracleParameter)parameter).OracleDbTypeEx = OracleDbType.XmlType; 

     if (value == null) 
     { 
      parameter.Value = DBNull.Value; 
     } 
     else 
     { 
      XDocument xDoc = (XDocument)value; 
      parameter.Value = xDoc.ConvertToString(); 
     } 
    }