0

XDocument プロパティ型から Oracle XMLType にマップする最良の方法を探していますか? レガシー データベースにマッピングしていますが、スキーマを制御できません。オラクル9iです。

nHibernate のバージョン 3 は、このタイプのマッピングにすぐに使用できる機能を提供することを読みました。流暢なマッピングでバージョン 3.1 を使用しています。作成時にデフォルトのマップを使用すると、次のエラーが表示されます。

System.ArgumentOutOfRangeException : 指定された引数が有効な値の範囲外でした。Oracle.DataAccess.Client.OracleParameter.set_DbType(DbType 値) で NHibernate.Driver.DriverBase.SetCommandParameters(IDbCommand cmd, SqlType[] sqlTypes) で d:\CSharp\NH\NH\nhibernate\src\NHibernate\Driver\DriverBase .cs: NHibernate.Driver.DriverBase.GenerateCommand(CommandType type, SqlString sqlString, SqlType[] parameterTypes) の 180 行目 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Driver\DriverBase.cs: 136 行目d:\CSharp\NH\NH\nhibernate\src\NHibernate\AdoNet\AbstractBatcher.cs の NHibernate.AdoNet.AbstractBatcher.Generate(CommandType type, SqlString sqlString, SqlType[] parameterTypes): NHibernate.AdoNet.AbstractBatcher の 78 行目。 PrepareBatchCommand(CommandType type, SqlString sql, SqlType[] parameterTypes) in d:

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 : 挿入できませんでした: [XmlBlob#95586][SQL: INSERT INTO XMLBLOB (CAT_CODE, BLB_BLOB, BLB_ID) VALUES (?, ?, ?)] ----> Oracle.DataAccess.Client.OracleException : ORA-01461: LONG列に挿入する場合のみLONG値をバインドできます

4

1 に答える 1

0

4000 文字を超える文字を XMLType 列に保存できるようにするために必要な唯一の更新は、ユーザー型実装の set メソッドでパラメーター型を 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();
        }
    }
于 2012-01-25T15:47:55.500 に答える