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) 在 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Driver\DriverBase.cs 的第 180 行:第 136 行NHibernate.AdoNet.AbstractBatcher.Generate(CommandType type, SqlString sqlString, SqlType[] parameterTypes) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\AdoNet\AbstractBatcher.cs: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 回答