Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

String panjang di N-Hibernate dengan Oracle menyebabkan kesalahan

Ini adalah masalah yang diketahui dengan System.Data.OracleClient.OracleConnection yang disediakan .NET pengemudi. Cara mengatasinya adalah dengan menggunakan klien ODP.net yang disediakan Oracle Oracle.DataAccess.Client.OracleConnection (lihat:http://nuget.org/packages/odp.net.x86/) atau gunakan solusi berikut (dirujuk dari: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;
        }
    }
}

Anda perlu memperbarui SessionFactory untuk menggunakan driver ini, serta memperbarui pemetaan clob Anda untuk menggunakan StringClob jenis khusus

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. Oracle SQL:Perbarui tabel dengan data dari tabel lain

  2. Menggunakan PL/SQL bagaimana Anda memasukkan konten file ke gumpalan?

  3. Bagaimana cara menghapus kumpulan koneksi ODP.NET pada kesalahan koneksi?

  4. Bagaimana cara menggunakan nomor baris?

  5. bagaimana cara mendeklarasikan %ROWTYPE dari variabel yang merupakan SYS_REFCURSOR yang diketik dengan lemah?