首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NHibernate 3.3:使用BLOB参数执行Oracle11g存储过程

NHibernate 3.3:使用BLOB参数执行Oracle11g存储过程
EN

Stack Overflow用户
提问于 2012-05-02 19:56:39
回答 1查看 1.1K关注 0票数 1

我使用NHibernate 3.3和ODP.NET来持久化到Oracle11g数据库,这是配置的相关部分:

代码语言:javascript
复制
<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字段,并设置一个块来执行插入存储过程,如下所示:

代码语言:javascript
复制
  <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>

数字实体在size<=32k文件中持续存在,但我得到了这个错误ORA-01460: size>32k文件请求的未实现或不合理的转换。

这是司机的限制吗?我怎么能解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2013-03-12 14:23:22

我也遇到了同样的问题(NHibernate 3.3.1.4000,Oracle11g)。NHibernates OracleDataClientDriver设置dbParam.DbType = DbType.Binary。这就导致了32K的限制。当设置为dbParam.OracleDbType = OracleDbType.Blob时,限制就消失了。为了存档这个文件,我创建了自己的Oracle驱动程序:

代码语言:javascript
复制
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;
    }
  }

最后,驱动程序需要在配置中注册:

代码语言:javascript
复制
<property name="connection.driver_class">MyDataAccess.OracleOdpClientDriver, MyDataAccess</property>

另见这里这里。我想知道这个解决方案是否足够好,可以集成到NHibernate中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10420736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档