zoukankan      html  css  js  c++  java
  • .Net处理Oracle中Clob类型字段总结

      最近在做项目中用到Clob这个字段,Clob是存储无限长字符的Oracle字段,用的时候网上找资料找了好久,内容不是很多,大部分都不能用,当然也有可以用的,测试了不同版本,整理了一下,给大家在做项目的时候以参考。

    表操作

      第一种方案很简单,是数据库表中的某个字段是Clob类型,需要对这个表进行增加修改,网上有很多版本,我试了一种最简单的:

        new OracleParameter(":Test", OracleType.Clob,System.Text.Encoding.Unicode.GetByteCount(model.Test)),

      就是在创建参数的时候指定一个长度,为什么这样写,不是很清楚,我试过超过4000字符存储和修改是没什么问题的。下面给参数赋值直接赋值就行了,就那么简单!

    参数操作

      第一种是对表中Clob的操作,还有一种情况是,在Oracle中定义的存储过程和函数,参数的类型是Clob类型,如果用第一种方式的话就会报错,字符超过最大,我想是虽然参数类型是Clob但是传过去的是字符,Oracle默认应该是把传过来的值当做字符看待了,第一种不行,就找了另一种实现方法,我们看下:

            public static OracleLob GetOracleClob(string strValue)
            {
                using (OracleConnection connection = new OracleConnection(connectionString))
                {
                    try
                    {
                        connection.Open();
                        string str = strValue;
                        byte[] array = Encoding.Unicode.GetBytes(str);
                        if (array.Length % 2 != 0)
                        {
                            array = Encoding.Unicode.GetBytes(str + ' ');
                        }
                        OracleCommand lobCmd = connection.CreateCommand();
                        // 为访问表定义一个游标 clobvar
                        string cmdSql = "DECLARE clobvar CLOB;";
                        cmdSql += " begin ";
                        cmdSql += " dbms_lob.createtemporary(clobvar, false, 0); :tempLob:= clobvar; ";
                        cmdSql += " end;";
                        lobCmd.CommandText = cmdSql;
                        lobCmd.Parameters.Add(new OracleParameter("tempLob", OracleType.Clob)).Direction = ParameterDirection.Output;
                        lobCmd.ExecuteNonQuery();
    
                        // 利用事务处理(必须)
                        OracleTransaction tx = connection.BeginTransaction();
                        lobCmd.Transaction = tx;
    
                        // 定义一个临时变量
                        OracleLob tempLob = (OracleLob)lobCmd.Parameters["tempLob"].Value;
                        tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);
                        tempLob.Write(array, 0, array.Length);
                        tempLob.EndBatch();
                        // 提交事务
                        tx.Commit();
                        return tempLob;
                    }
                    catch (Exception e)
                    {
                        throw e;
                    }
                }
            }

      调用:

                parameters[0].Value = DbHelperOra.GetOracleClob(TestString);

      大家看代码可能明白一些,这里我说下自己的理解,先定义一个Byte,然后拼一个输出Clob类型的字符串,在Oracle执行后输出,然后把Byte写入输出的Clob变量,然后提交事务,我觉得得到的这个Clob类型才是真正的Clob类型,是和Oracle那边是一致的。这边有一个重要的是字符的编码,注意下要和Oracle那边要一致!

      

  • 相关阅读:
    QT VS配置UNICODE问题
    深入理解C++中的mutable关键字
    Qt creator error: LNK1123: 转换到 COFF 期间失败: 文件无效或损坏(vs2010的嵌入式清单文件)
    hdu 3401 Trade 单调队列优化dp
    QT父子与QT对象delete
    QT下的几种透明效果(三种方法:调色板,透明度属性,自绘)
    QT实现鼠标钩子(使用SetWindowsHookEx安装mouseProc函数)
    VirtualBox的网络设置(6种方式)
    8个成功界面的特性
    熬之滴水成石:Spring--精简的J2EE(7)
  • 原文地址:https://www.cnblogs.com/xishuai/p/3469871.html
Copyright © 2011-2022 走看看