2012-05-02 44 views
1

我使用NHibernate 3.3和ODP.NET堅持到Oracle11g的數據庫中的Oracle 11g存儲過程,這是結構的相對部分,以:NHibernate的3.3:執行與一個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> 

我一個byte []屬性映射到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> 

數字實體仍然存在確定與大小< = 32K文件;但我得到這個錯誤[ORA-01460:未實現或不合理的轉換請求]與大小> 32k文件。

是驅動程序限制嗎? 我該如何解決這個問題?

回答

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> 

參見herehere。 我不知道這是否是足夠好的解決方案,可以集成到NHibernate中。