Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Chuỗi dài trong N-Hibernate với Oracle gây ra lỗi

Đây là sự cố đã biết với System.Data.OracleClient.OracleConnection do .NET cung cấp người lái xe. Cách khắc phục là sử dụng ứng dụng khách ODP.net do Oracle cung cấp Oracle.DataAccess.Client.OracleConnection (xem:http://nuget.org/packages/odp.net.x86/) hoặc sử dụng cách giải quyết sau (tham khảo từ: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;
        }
    }
}

Bạn cần cập nhật SessionFactory của mình để sử dụng trình điều khiển này, cũng như cập nhật bất kỳ ánh xạ clob nào của bạn để sử dụng StringClob loại tùy chỉnh

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. Chuyển đổi Unixtime sang Datetime SQL (Oracle)

  2. Biểu mẫu Oracle trong R12 / R12.2

  3. Các yếu tố kích hoạt ngăn ngừa

  4. Làm cách nào để chèn vào cột BLOB từ một câu lệnh chèn trong sqldeveloper?

  5. truyền mảng số nguyên cho thủ tục oracle bằng c #