Сопоставление сгустков с использованием Fluent NHibernate, Oracle 10g и OracleClientConfiguration.Oracle10 - PullRequest
3 голосов
/ 10 ноября 2011

Я пытался отобразить поле clob с помощью Fluent NHibernate 1.2.0.712 против Oracle 10g.Я использую провайдера System.Data, так как он доступен по умолчанию и пытался избежать добавления ссылки на ODP.Net из-за предыдущих проблем с клиентом.

Однако, когда я пытаюсь вставить сущности со свойствами сопоставленного сгустка, я получаю ошибку:

ORA-01461: может связывать значение LONG только для вставки в столбец LONG

Я пытался исправить это, используя приведенное ниже соглашение и декорируя соответствующее свойство с помощью [StringLength (4000)]:

public class StringLengthConvention : AttributePropertyConvention<StringLengthAttribute>
{
    protected override void Apply(StringLengthAttribute attribute, IPropertyInstance instance)
    {
        instance.Length(attribute.MaximumLength);
    }
}

Это не сработало.

Затем я попробовал следующее, используя значения «TEXT», «CLOB» и «clob».Ни один из них не работал:

    public class plaparteMappingOverride : IAutoMappingOverride<plaparte>
    {
        public void Override(AutoMapping<plaparte> mapping)
        {
           Map(x => x.disposiciones).CustomSqlTypeIs("TEXT");
        } 
    }

У кого-нибудь есть дополнительные предложения для этого исправления, кроме добавления ODP в качестве поставщика?

1 Ответ

0 голосов
/ 17 августа 2012

Для дальнейшего использования: этот пост прекрасно описывает, что вызывает эту ошибку и как ее можно исправить.

ORA-01461: может связывать значение LONG только для вставки вдлинный столбец

Эта ошибка не очень полезна, и ее появление, скорее всего, приведет к темам, касающимся исправлений оракула и тому подобного.На самом деле это ошибка в драйвере клиента Microsoft Oracle.Драйвер по ошибке определяет тип столбца сохраняемой строки и пытается заставить сервер обновить значение LONG в тип столбца CLOB / NCLOB.Причина неправильного поведения еще более неясна и возникает только тогда, когда выполнены все следующие условия.

  1. , когда мы устанавливаем IDbDataParameter.Value = (строка, длина которой: 4000> длина> 2000)
  2. , когда мы устанавливаем IDbDataParameter.DbType = DbType.String
  3. , когда столбец БД имеет тип NCLOB / CLOB

К сожалению, поведение по умолчанию NHibernate 2.0 -сделайте в точности то же самое, что повышает вероятность появления этой ужасной ошибки при использовании nhibernate и oracle.

Решение, предлагаемое в сообщении в блоге: пользовательский драйвер Oracle NHibernate:

/// <summary>
/// Initializes the parameter.
/// </summary>
/// <param name="dbParam">The db param.
/// <param name="name">The name.
/// <param name="sqlType">Type of the SQL.
protected override void InitializeParameter(System.Data.IDbDataParameter dbParam, string name, global::NHibernate.SqlTypes.SqlType sqlType)
{
    base.InitializeParameter(dbParam, name, sqlType);

    //System.Data.OracleClient.dll driver generates an exception
    //we set the IDbDataParameter.Value = (string whose length: 4000 > length > 2000 )
    //when we set the IDbDataParameter.DbType = DbType.String
    //when DB Column is of type NCLOB/CLOB
    //The Above is the default behavior for NHibernate.OracleClientDriver
    //So we use the built-in StringClobSqlType to tell the driver to use the NClob Oracle type
    //This will work for both NCLOB/CLOBs without issues.
    //Mapping file will need to be update to use StringClob as the property type
    if ((sqlType is StringClobSqlType))
    {
        ((OracleParameter)dbParam).OracleType = OracleType.NClob;
    }
}
...