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

C#处理oracle数据库的Clob类型

通过C#语言,使用.net的ado组件录入oracle数据库的Clob类型字段:

1。当录入字符串过长,导致ado的命令Command的CommandText字符串大于4056,录入会失败,提示:

ORA-01704字符串文字太长。

2。同样情况下,如果采用通过ado的命令Command访问oracle存储过程,并且使用命令参数形式传入超长的字符串,当字符串本身长度大于32512时,录入才会失败,提示:

ORA-01460 转换请求无法实现或不合理。

出现上述两种情况,可以用下面代码解决:

 

 /// <summary>
        /// 处理clob数据后保存,成功
        /// </summary>
        private void button1_Click(object sender, EventArgs e)
        {
            string ClobString = CreateClobString();           

            string ConnectionString = ConfigurationManager.AppSettings["ConnectionString"].ToString();
            System.Data.OracleClient.OracleConnection oc = new System.Data.OracleClient.OracleConnection(ConnectionString);
            oc.Open();
            try
            {
            OracleCommand command = new OracleCommand();
            command.Connection = oc;
            command.CommandType = CommandType.Text;
            command.CommandText = "INSERT INTO demo_table (demo_id,demo_clob) VALUES ("+id.ToString()+", 'aa')";
            richTextBox1.Text = "SQL语句字符串长度:" + command.CommandText.Length + "\r\n" + "SQL语句字符串内容:";
            richTextBox1.Text += command.CommandText;
            int ii = command.ExecuteNonQuery();
            //修改Clob数据
            if (ii > 0)
                UpdateClobData(oc, "SELECT demo_clob FROM demo_table WHERE demo_id=" + id + " FOR UPDATE", ClobString);
            }
            catch (Exception ex)
            {
                MessageBox.Show("保存失败:" + ex.Message);
            }
            finally
            {
                oc.Close();
            }
        }

#region Oracle大对象处理

        /// <summary>
        /// // CreateTempLob
        /// </summary>        
        private OracleLob CreateTempLob(OracleCommand cmd, OracleType lobtype)
        {
            if (lobtype == null) return null;
            if (cmd == null) return null;

            //Oracle server syntax to obtain a temporary LOB.
            cmd.CommandText = "DECLARE A " + lobtype + "; " +
                           "BEGIN " +
                              "DBMS_LOB.CREATETEMPORARY(A, FALSE); " +
                              ":LOC := A; " +
                           "END;";

            //Bind the LOB as an output parameter.
            OracleParameter p = cmd.Parameters.Add("LOC", lobtype);
            p.Direction = ParameterDirection.Output;

            //Execute (to receive the output temporary LOB).
            cmd.ExecuteNonQuery();

            //Return the temporary LOB.
            return (OracleLob)p.Value;
        }

        /// <summary>
        /// 修改Clob数据
        /// </summary>
        public void UpdateClobData(OracleConnection sc, string SQLString, string ReportString)
        {
            if (sc == null) return;
            if (string.IsNullOrEmpty(SQLString)) return;
            if (string.IsNullOrEmpty(ReportString)) return;

            //用OracleLob输入Clob数据
            OracleCommand cmd = sc.CreateCommand();
            cmd.Transaction = cmd.Connection.BeginTransaction();
            cmd.CommandText = SQLString;
            OracleDataReader reader = cmd.ExecuteReader();
            using (reader)
            {
                reader.Read();
                OracleLob blob = reader.GetOracleLob(0);
                OracleLob templob = CreateTempLob(cmd, blob.LobType);
                byte[] buffer = System.Text.Encoding.Unicode.GetBytes(ReportString);
                //将文件内容传入Blob变量
                templob.BeginBatch(OracleLobOpenMode.ReadWrite);
                templob.Write(buffer, 0, buffer.Length);
                templob.Position = 0;
                long actual = templob.CopyTo(blob);
                cmd.Transaction.Commit();
            }
        }
        
        #endregion           

下面是示例代码地址:

 http://files.cnblogs.com/wrzhao/DemoApplication.rar

下载后,需要执行“demoSQL.sql”建立程序运行所需表和存储过程;需要修改“App.config”文件里的数据库连接字符串。

转载于:https://www.cnblogs.com/wrzhao/archive/2012/09/12/wrzhao.html

相关文章:

  • I have a dream
  • [笔记]8组LVDS_TX和LVDS_RX的调试心得
  • Struts2数据传输的背后机制:ValueStack(值栈)
  • A Medical Study Tool Developed with WPF
  • POJ题目分类---模拟[A一道删一道]
  • EJB之JPA(UUID与TABLE影射策略)
  • text-overflow:ellipsis溢出显示省略号兼容所有浏览器的解决办法
  • 场景中的物体显示 为BoundingBox
  • PHP程序员最常犯的11个MySQL错误
  • css书写顺序
  • 创建Metro风格的WPF界面
  • java command
  • [转载]详解Cassandra配置文件配置项
  • 编写一个函数比较两个整数大小,但不能使用任何比较操作符
  • gridControl控件显示交叉表
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • Angular 响应式表单 基础例子
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • download使用浅析
  • js对象的深浅拷贝
  • Next.js之基础概念(二)
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 跨域
  • 什么软件可以剪辑音乐?
  • 实战|智能家居行业移动应用性能分析
  • 使用agvtool更改app version/build
  • 我这样减少了26.5M Java内存!
  • 自动记录MySQL慢查询快照脚本
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (待修改)PyG安装步骤
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (定时器/计数器)中断系统(详解与使用)
  • (二)Linux——Linux常用指令
  • (附源码)php投票系统 毕业设计 121500
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (算法)N皇后问题
  • (转)为C# Windows服务添加安装程序
  • **python多态
  • ../depcomp: line 571: exec: g++: not found
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • [ C++ ] STL_list 使用及其模拟实现
  • [ C++ ] STL_vector -- 迭代器失效问题
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [20171101]rman to destination.txt
  • [202209]mysql8.0 双主集群搭建 亲测可用
  • [Angular 基础] - 指令(directives)
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [AX]AX2012 SSRS报表Drill through action
  • [BZOJ 3680]吊打XXX(模拟退火)