文档章节

NHibernate映射oracle数据库CLOB、BLOB类型大数据字段

彩色铅笔
 彩色铅笔
发布于 2014/07/17 18:44
字数 749
阅读 1761
收藏 11

最初始最简单的方法如下:

首先建一个测试类:

public class testClass
  {
     //需要映射为CLOB类型的字段
     public string WKT{get;set;}
  }

nhibernate配置文件中:

<property column="WKT" type="StringClob" name="WKT" length="200000" />

具体nhibernate的配制方法什么的不在此赘述,请查看本人nhibernate相关博客。

番外:CLOB、BLOB字段最大上限为4GB,即4x1024x1024x1024个字节,除非特别需要,不建议length过大,合适就行。我取的20万字节

写一个简单的方法插入数据测试:

var testClass = new testClass();
testClass.WKT = data; // data是一个变量,存储你要插入的字符串
ISession session = SessionFactory.OpenSession();
session.Save(testClass);
session.Flush();

我们会发现此时oracle数据库WKT字段为NCLOB类型,但是测试数据在2000字节以下以及4000字节以上时顺利通过,在2000-4000字节时发生错误【ORA-01461:仅可以插入LONG列的LONG值赋值】,具体原因听大神说貌似是oracle.client的问题,在此不做详细解释。

具体解决方案如下:

相信大家做nhibernate映射时都会遇到自定义类型的情况,如不会请参考本人相关nhibernate微博。那么我们也可以为CLOB自定义一个类型来设置正确的oracleType:

首先添加一个针对LOB字段的补丁类(如果只涉及到CLOB字段,也可以直接添加针对CLOB的类,一步到位):

PatchForOracleLobField.cs

using System;
using System.Collections.Generic;
using System.Data;
using System.Text;
using NHibernate;
using NHibernate.SqlTypes;
using NHibernate.UserTypes;
namespace Test.type
{
    public abstract class PatchForOracleLobField : IUserType
    {
        public bool IsMutable
        {
            get { return false; }
        }
        public System.Type ReturnedType
        {
            get { return typeof(StringClobSqlType); } //注意此处
        }
        public SqlType[] SqlTypes
        {
            get
            {
                return new SqlType[] { NHibernateUtil.StringClob.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;
        }
    }
}

再添加一个针对CLOB的类:

OracleClobField.cs

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OracleClient;
using System.Text;
namespace Test.type
{
    public class OracleClobField : PatchForOracleLobField
    {
        public override void NullSafeSet(IDbCommand cmd, object value, int index)
        {
            if (cmd is OracleCommand)
            {
                OracleParameter param = cmd.Parameters[index] as OracleParameter;
                if (param != null)
                {
                    param.OracleType = OracleType.Clob;  //注意此处
                    param.IsNullable = true;
                }
            }
            NHibernate.NHibernateUtil.StringClob.NullSafeSet(cmd, value, index);
        }
    }
}

然后我们修改nhibernate的映射文件:

修改前:

<property column="WKT" type="StringClob" name="WKT" length="200000" />

修改后:

<property column="WKT" type="命名空间+testClass, testClass所在程序集" name="WKT" length="200000" />

再次调用测试方法进行测试,发现问题解决!!!

注:相信大家都知道nhibernate映射时,表已存在则只添加不修改,所以建议删库后重建表测试!

© 著作权归作者所有

彩色铅笔
粉丝 4
博文 7
码字总数 7969
作品 0
朝阳
程序员
私信 提问
加载中

评论(2)

彩色铅笔
彩色铅笔

引用来自“秦时明月”的评论

建议用moon.orm
谢谢,我闲暇的时候研究研究你说的这个东东
无聊的人啊
无聊的人啊
建议用moon.orm
NHibernate从入门到精通系列(6)——基本映射

内容摘要 映射定义概括 基本映射常用标签 NHibernate的类型 一、映射定义概括 1.1 映射定义(Mapping declaration) 对象和关系数据库之间的映射是用一个XML文档(XML document)来定义的。这个...

长平狐
2012/06/11
1K
0
Oracle中Clob类型处理解析

摘要 最近利用NHibernate映射类型为Clob字段在插入数据时发现当字符的字节数(一个半角字符一个字节,一个全角字符两个字节)在2000-4000之间时报错(ORA-01461:仅可以插入LONG列的LONG值赋值...

i33
2015/06/18
0
0
NHibernate从入门到精通系列(1)——NHibernate概括

内容摘要 NHibernate简介 ORM简介 NHibernate优缺点 一、NHibernate简介 什么是?NHibernate?NHibernate是一个面向.NET环境的对象/关系数据库映射工具。对象/关系数据库映射(object/relati...

长平狐
2012/06/11
576
0
NHibernate从入门到精通系列(2)——NHibernate环境与结构体系

内容摘要 NHibernate的开发环境 NHibernate的结构体系 NHibernate的配置 一、NHibernate的开发环境 NHibernate的英文官方网站为:http://nhforge.org/ NHibernate目前最新的版本是3.0.0.GA,...

长平狐
2012/06/11
845
0
NHibernate 快速入门

这篇教程将透过你的第一个NHibernate项目,讲述配置和映射所需要的基本步骤。 仅关注我们想要的,我们将从一个很简单的例子开始。为了让代码量最小,我们也去掉了单元测试和接口的代码,专一...

徐继开
2013/07/12
15.7K
25

没有更多内容

加载失败,请刷新页面

加载更多

火焰图(flame graph)是性能分析利器

Perf命令 Perf 命令(performance的简写)是 Linux 系统原生提供的性能分析工具,返回 CPU 正在执行的函数名以及调用栈(stack)。 通常,它的执行频率是 99Hz(每秒99次),如果99次都返回同一个...

呼呼南风
6分钟前
0
0
 好程序员大数据知识点精讲 大数据之Linux

好程序员大数据知识点精讲 大数据之Linux -Linux是什么? Linux是一套作业系统,不是应用程序Linux的基本思想有两点:第一,一切都是文件;第二,每个软件都有确定的用途。 Shell——命令行解...

好程序员IT
10分钟前
0
0
mysql 多行结合

select a1.email as email ,a1.bg ,IFNULL(a1.bg, a2.bg) from ( select * from test01 where sdate = '2019-09-11' ) a1 LEFT join (select * from test01 where sdate = '2019-09-10') a2 ......

昏鸦
11分钟前
0
0
Netflix Eureka 续约 & 更新注册表信息

Eureka Client 要定期的向 Eureka Server 发送心跳请求以保持续约的状态。 也需要定期的从 Eureka Server 获取服务注册表数据,并将服务注册表数据缓存在客户端实例内。 Eureka Client 续约 ...

BryceLoski
15分钟前
11
0
IT兄弟连 Java语法教程 Java开发环境 JVM、JRE、JDK

要想开发Java程序,就需要知道什么是JVM、JRE以及JDK。JVM是运行Java程序的核心,JRE是支持Java程序运行的环境,而JDK是Java开发的核心,下面我们分别具体介绍它们以及它们之间的关系。 1.J...

老码农的一亩三分地
24分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部