Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Długie ciągi znaków w N-Hibernate z Oracle powodują błąd

Jest to znany problem z dostarczonym przez platformę .NET System.Data.OracleClient.OracleConnection kierowca. Poprawka polega na użyciu dostarczonego przez Oracle klienta ODP.net Oracle.DataAccess.Client.OracleConnection (patrz:http://nuget.org/packages/odp.net.x86/) lub skorzystaj z następującego obejścia (odwołanie z:http://thebasilet.blogspot.be/2009/07/nhibernate-oracle-clobs.html ).

public class CustomOracleDriver : OracleClientDriver
{
    protected override void InitializeParameter(System.Data.IDbDataParameter dbParam, string name, SqlType sqlType)
    {
        base.InitializeParameter(dbParam, name, sqlType);


        // System.Data.OracleClient.dll driver generates an ORA-01461 exception because 
        // the driver mistakenly infers the column type of the string being saved, and 
        // tries forcing the server to update a LONG value into a CLOB/NCLOB column type. 
        // The reason for the incorrect behavior is even more obscure and only happens 
        // when all the following conditions are met.
        //   1.) IDbDataParameter.Value = (string whose length: 4000 > length > 2000 )
        //   2.) IDbDataParameter.DbType = DbType.String
        //   3.) 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 must be updated to use StringClob as the property type
        // See: http://thebasilet.blogspot.be/2009/07/nhibernate-oracle-clobs.html
        if ((sqlType is StringClobSqlType))
        {
            ((OracleParameter)dbParam).OracleType = OracleType.NClob;
        }
    }
}

Musisz zaktualizować swoją SessionFactory aby używać tego sterownika, a także zaktualizować dowolne mapowania clob, aby używały StringClob typ niestandardowy

Map(x => x.EventType).CustomSqlType("Clob").CustomType("StringClob");



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaki jest minimalny zasięg klienta wymagany do połączenia C# z bazą danych Oracle?

  2. Pytania dotyczące Oracle DBA w czasie rzeczywistym

  3. Nie znaleziono klienta Oracle i komponentów sieciowych

  4. Jak za pomocą zapytania uzyskać listę miesięcy pomiędzy 2 podanymi datami?

  5. MONTHS_BETWEEN() Funkcja w Oracle