2012-05-02 3 views
1

Я использую NHibernate 3.3 и ODP.NET сохраняться в базе данных Oracle11g, это конфигурация Раздел относительно:NHibernate 3.3: выполнение хранимой процедуры Oracle 11g с параметром BLOB

<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property> 
<property name="dialect">NHibernate.Dialect.Oracle10gDialect</property> 
<property name="connection.driver_class">NHibernate.Driver.OracleDataClientDriver</property> 

Я отображение байт [] объекта в поле BLOB и установка блока, чтобы выполнить вставку хранимую процедуру так:

<class name="Digital" table="DIGITALS"> 
    <id name="Id" column="COD_DIGITAL"> 
     <generator class="increment" /> 
    </id> 
    <property name="File" column="FILE" /> 

    <sql-insert>begin PKG_DIGITALS.insert_sp(?,?); end;</sql-insert> 

Digital объект сохраняется нормально с размером < = 32k файлов; но я получаю эту ошибку [ORA-01460: неосуществленное или необоснованное преобразование запрошено] с размером> 32 тыс. файлов.

Это ограничение драйвера? Как я могу это решить?

ответ

0

У меня была та же проблема (NHibernate 3.3.1.4000, Oracle 11g). NHibernates OracleDataClientDriver устанавливает dbParam.DbType = DbType.Binary. Это приводит к этому пределу 32K. Когда вы устанавливаете dbParam.OracleDbType = OracleDbType.Blob, предел ушел. Для архивирования этого я создал свой собственный драйвер Oracle:

public class OracleOdpClientDriver : OracleDataClientDriver 
{ 
    protected override void InitializeParameter(System.Data.IDbDataParameter dbParam, string name, NHibernate.SqlTypes.SqlType sqlType) 
    { 
    base.InitializeParameter(dbParam, name, sqlType); 
    var oraParam = dbParam as OracleParameter; 
    if (oraParam != null) 
    { 
     if (sqlType.DbType == System.Data.DbType.Binary) 
     // Use Oracle Blob instead of Binary to prevent a 32K limit. 
     oraParam.OracleDbType = OracleDbType.Blob; 
     else if (sqlType.DbType == System.Data.DbType.String && sqlType.LengthDefined && sqlType.Length >= 32768) 
     // StringClob params must not be mapped to Varchar2 because that has a 32K limit. 
     oraParam.OracleDbType = OracleDbType.Clob; 
    } 
    } 

Наконец, водителю нужно зарегистрировано в конфигурации:

<property name="connection.driver_class">MyDataAccess.OracleOdpClientDriver, MyDataAccess</property> 

Смотри также here и here. Интересно, достаточно ли это решение для интеграции в NHibernate.

Смежные вопросы