当前位置: 首页 > news >正文

NHibernate+Oracle 遇到ORA-01461和ORA-01084及解决方法

如果使用到Oracle的CLOB字段,那么NHibernate会遇到很诡异的“ORA-01461:仅可以插入LONG列的LONG值赋值”错误。关于此错误的分析和解决方法在这里(http://blog.csdn.net/pojianbing/archive/2008/08/09/2789426.aspx)有详细的介绍,实现NHibernate的自定义类型IUserType接口 :

    public abstract class PatchForOracleLobField : IUserType
    {
        public PatchForOracleLobField()
        {
        }
        public bool IsMutable
        {
            get { return true; }
        }
        public System.Type ReturnedType
        {
            get { return typeof(String); }
        }
        public SqlType[] SqlTypes
        {
            get
            {
                return new SqlType[] { NHibernateUtil.String.SqlType };
            }
        }
        public object DeepCopy(object value)
        {
            return value;
        }
        public new bool Equals(object x, object y)
        {
            return x == y;
        }
        public int GetHashCode(object x)
        {
            return x.GetHashCode();
        }
        public object Assemble(object cached, object owner)
        {
            return DeepCopy(cached);
        }
        public object Disassemble(object value)
        {
            return DeepCopy(value);
        }
        public object NullSafeGet(IDataReader rs, string[] names, object owner)
        {
            return NHibernate.NHibernateUtil.StringClob.NullSafeGet(rs, names[0]);
        }
        public abstract void NullSafeSet(IDbCommand cmd, object value, int index);
        public object Replace(object original, object target, object owner)
        {
            return original;
        }
    }
    public class OracleClobField : PatchForOracleLobField
    {
        public override void NullSafeSet(IDbCommand cmd, object value, int index)
        {
            if (cmd is OracleCommand)
            {
                //CLob、NClob类型的字段,存入中文时参数的OracleDbType必须设置为OracleDbType.Clob
                //否则会变成乱码(Oracle 10g client环境)
                OracleParameter param = cmd.Parameters[index] as OracleParameter;
                if (param != null)
                {
                    param.OracleType = OracleType.Clob;// 关键就这里啦
                    param.IsNullable = true;
                }
            }
            NHibernate.NHibernateUtil.StringClob.NullSafeSet(cmd, value, index);
        }
    }

 

用此方法解决了CLOB字段2000-4000字的问题,可是今天又遇到了个新的“ORA-01084: OCI 调用中的参数无效”错误,google了一下,大概是说CLOB字段如果为null或’’时就会出这个错。

解决的办法:

将OracleClobField.NullSafeSet中的

if (cmd is OracleCommand) ….

改为

if ((cmd is OracleCommand) && !string.IsNullOrEmpty(value as string))

 

如果值是空或者空字符串的话就让NHibernate当默认的varchar2处理。

 

from:http://wuchang.cnblogs.com

相关文章:

  • 深入分析java web技术内幕----读书笔记(三)
  • 关于印发《天津市2010年节能与资源综合利用 清洁生产和环保产业工作要点》的通知...
  • java类加载器的父亲委托机制详细介绍
  • Linux裸设备相关命令
  • JavaSE 学习参考:接口
  • CISCO路由器配置基础3
  • Photoshop中消失点(Photoshop帮助文档)
  • Selenium2+Python--等待页面元素加载(wait)
  • Swift 数据类型
  • 服务台的工作流程
  • 【深度分解】听趣拍云产品经理剖析视频基础知识(1)
  • windows server 2003 FTP服务器不能下载原因
  • 上火了
  • 干货:让你分分钟学会 JS 闭包
  • jeffcroft/html5 Two thousand twenty two
  • SegmentFault for Android 3.0 发布
  • 自己简单写的 事件订阅机制
  • [译]如何构建服务器端web组件,为何要构建?
  • 2019.2.20 c++ 知识梳理
  • C# 免费离线人脸识别 2.0 Demo
  • C++入门教程(10):for 语句
  • CentOS7 安装JDK
  • CSS中外联样式表代表的含义
  • Map集合、散列表、红黑树介绍
  • Mocha测试初探
  • MySQL几个简单SQL的优化
  • Mysql数据库的条件查询语句
  • node.js
  • Phpstorm怎样批量删除空行?
  • SQL 难点解决:记录的引用
  • vue.js框架原理浅析
  • 给初学者:JavaScript 中数组操作注意点
  • 基于HAProxy的高性能缓存服务器nuster
  • 目录与文件属性:编写ls
  • 前端学习笔记之观察者模式
  • 收藏好这篇,别再只说“数据劫持”了
  • 思否第一天
  • 学习Vue.js的五个小例子
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • #每天一道面试题# 什么是MySQL的回表查询
  • #前后端分离# 头条发布系统
  • (6)STL算法之转换
  • (C语言)fgets与fputs函数详解
  • (C语言)fread与fwrite详解
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (八)Flask之app.route装饰器函数的参数
  • (超详细)语音信号处理之特征提取
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境