You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用NHibernate 5.4.6向Oracle插入字节数组遇ORA-22835错误

解决NHibernate 5.4.6向Oracle插入字节数组时的ORA-22835错误

问题场景

用C#结合NHibernate 5.4.6版本向Oracle数据库插入文件字节数组时,触发错误:ORA-22835: Insufficient buffer size for converting CLOB to CHAR or BLOB to RAW (actual: 81863, maximum: 2000),但相同代码和数据库结构在NHibernate 3.1.0版本下能正常执行。当前列映射配置如下:

<property name="Image" type="BinaryBlob">
      <column name="IMAGE" not-null="false" sql-type="LONG RAW" />
</property>

问题原因

NHibernate版本升级后,对LONG RAW类型的处理逻辑发生了变化。5.x版本中,BinaryBlob类型默认与Oracle的BLOB类型绑定,插入大字节数组时会触发BLOB转RAW的类型转换,而RAW类型的缓冲区上限仅为2000字节,导致报错;但3.1.0版本的处理逻辑更兼容LONG RAW的大二进制存储需求。

解决方案

  • 修改映射类型匹配
    将映射中的type改为Binary,保留sql-type="LONG RAW",让NHibernate明确按LONG RAW的规则处理字节数组:

    <property name="Image" type="Binary">
          <column name="IMAGE" not-null="false" sql-type="LONG RAW" />
    </property>
    
  • 更换数据库列类型为BLOB
    Oracle官方推荐用BLOB存储大二进制数据(LONG RAW属于旧类型),如果允许修改数据库结构,将IMAGE列类型改为BLOB,同时调整映射配置:

    <property name="Image" type="BinaryBlob">
          <column name="IMAGE" not-null="false" sql-type="BLOB" />
    </property>
    
  • 更新Oracle方言配置
    检查项目使用的Oracle方言,确保是对应数据库版本的方言(比如Oracle12cDialect),部分旧方言在NHibernate 5.x版本中对LONG RAW的支持存在缺陷,更新方言后可解决类型转换的缓冲区问题。

内容的提问来源于stack exchange,提问作者Santosh Vishwakarma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 07:10:06