NHibernate 3.3:使用 BLOB 参数执行 Oracle 11g 存储过程



我正在使用 NHibernate 3.3 和 ODP.NET 来持久保存到 Oracle11g 数据库,这是相对于以下配置的部分:

<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文件。

这是驱动程序限制吗?我该如何解决此问题?

我遇到了同样的问题(NHibernate 3.3.1.4000,Oracle 11g)。NHibernates OracleDataClientDriver set 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>

另请参阅此处和此处。我想知道这是否足够好,可以集成到NHibernate中。

最新更新