2012-01-24 9 views
0

XDocumentプロパティ・タイプからOracle XMLTypeにマップする最良の方法をお探しですか?私は従来のデータベースにマッピングしており、スキーマを制御することはできません。これはOracle 9iです。Fluent NHibernate Oracle XMLTypeへのXDocumentプロパティのマッピング

このバージョンの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(); 
     } 
    } 
関連する問題