C# oracle Clob与Blob数据的读写

在C#中对oracle数据中clob字段类型及blob字段类型读写怎么处理呢?最初使用update语句更新表之间的关系时,发现clob及blob的数据都没有更新掉。在百度上百度半天时间,发现是clob及blob的数据,不能直接处理,只能用代码的逻辑去处理。而且获取的逻辑还不是很一样。现在就把这两种处理逻辑记录下来,为各位同学及以后的我使用。

第一步:oracle数据连接参数

 public string orclconnstr = "User ID={2};Password={3};Data Source=(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST = {0})(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = {1})))";

第二步:数据库连接方法:

 public OracleConnection connect(string orclServer, string oracleOrcl, string orclUser, string orclPassword)
        {
            orclconnstr = string.Format(orclconnstr, orclServer, oracleOrcl, orclUser, orclPassword);
            orclconn = new OracleConnection(orclconnstr);
            return orclconn;

        }

第三步:CLOB数据读取:

/**
         * 读取clob数据
         * */
        public string getClobContext( string sql)
        {
            string context = "";
           OracleConnection  orclconn = connect("127.0.0.1","orcl","test","1");
         if (orclconn != null)
         {
             using (OracleConnection conn = new OracleConnection(orclconn.ConnectionString))
             {
                 try
                 {
                     conn.Open();
                     OracleCommand cmd = new OracleCommand(sql, conn);
                     OracleDataReader reader = cmd.ExecuteReader();
                     reader.Read();
                     OracleLob clob = reader.GetOracleLob(0); 
                     context = StringHelper.FormatStringByObject(clob.Value);
                     reader.Close();
                 }
                 catch (Exception ex)
                 {
                    // LogHelper.LogHelper.logHelper.ErrorLog(ex.Message, "");
                 }
                 finally
                 {
                     conn.Close();
                 }
             }
         }
         return context;
        }

第四步:blob数据读取

 public byte[] getBlobContext( string sql)
        {
            Byte[] blob = null;
            OracleConnection  orclconn = connect("127.0.0.1","orcl","test","1");
            if (orclconn != null)
            {
                using (OracleConnection conn = new OracleConnection(orclconn.ConnectionString))
                {
                    try
                    {
                        conn.Open();
                        OracleCommand cmd = new OracleCommand(sql, conn);
                        OracleDataReader reader = cmd.ExecuteReader();
                        reader.Read();
                        blob = new Byte[(reader.GetBytes(0, 0, null, 0, int.MaxValue))];
                        reader.GetBytes(0, 0, blob, 0, blob.Length);
                        reader.Close();
                    }
                    catch (Exception ex)
                    {
                       // LogHelper.LogHelper.logHelper.ErrorLog(ex.Message, "");
                        //LogHelper.LogHelper.logHelper.ErrorLog(sql, "");                 
                    }
                    finally
                    {
                        conn.Close();
                    }
                }
            }
            return blob;
        }

第五步:数据插入

/**
         * 插入特殊字符信息
         * */
        public bool InsertSpecialInfo( string sql, List<OracleSpecialFields> lst)
        {
            OracleConnection  orclconn = connect("127.0.0.1","orcl","test","1");
            if (orclconn != null)
            {
                using (OracleConnection conn = new OracleConnection(orclconn.ConnectionString))
                {
                    try
                    {
                        conn.Open();
                        OracleCommand cmd = new OracleCommand(sql, conn);
                        foreach(OracleSpecialFields sf in lst)
                        {
                            OracleParameter oracleParameter = new OracleParameter(sf.Fieldname, sf.Fieldtype);
                            if (sf.FieldValue == "" || sf.FieldValue == null)
                            {
                                oracleParameter.Value = DBNull.Value;
                            }
                            else
                            {
                                oracleParameter.Value = sf.FieldValue;
                            }
                            cmd.Parameters.Add(oracleParameter);
                        }
                        //LogHelper.LogHelper.logHelper.InfoLog(sql, "");
                        int rows = cmd.ExecuteNonQuery();
                        cmd.Parameters.Clear();             
             
                        return true;
                    }
                    catch (Exception ex)
                    {
                       // LogHelper.LogHelper.logHelper.ErrorLog(ex.Message, "");
                        //LogHelper.LogHelper.logHelper.ErrorLog(sql, "");
                        return false;
                    }
                    finally
                    {
                        conn.Close();
                    }
                }
            }
            return false;
        }

第六步:测试用例

oracle数据库中的两个字段,一个blob,一个clob字段

第七步:创建一个对象类


    public class OracleSpecialFields
    {
        private string fieldname;

        public string Fieldname
        {
            get { return fieldname; }
            set { fieldname = value; }
        }
        private OracleType fieldtype;

        public OracleType Fieldtype
        {
            get { return fieldtype; }
            set { fieldtype = value; }
        }
        private object fieldValue;

        public object FieldValue
        {
            get { return fieldValue; }
            set { fieldValue = value; }
        }
    }

第八步:处理结果

/**
        * 更新房产分户图数据到历史层
        * */
        public static void InsertFcfht(string prj_id)
        {
             string layout = getClobContext( "SELECT LAYOUT  FROM TEST WHERE ID='" +prj_id + "'");//获取clob
                byte[] fcfht = getBlobContext( "SELECT FCFHT  FROM TEST WHERE ID='" + prj_id + "'");//获取blob

                string sql = "INSERT INTO TEST (ID,LAYOUT,FCFHT) VALUES(':ID',':BUILDING_ID',':VERSION',:CREATE_DATE,:LAYOUT,:FCFHT)";
                sql = sql.Replace(":ID", System.Guid.NewGuid().ToString());
                List<OracleSpecialFields> lst = new List<OracleSpecialFields>();
                OracleSpecialFields field_layout = new OracleSpecialFields();
                field_layout.FieldValue = layout;
                field_layout.Fieldtype = OracleType.Clob;
                field_layout.Fieldname = "LAYOUT";
                lst.Add(field_layout);
                OracleSpecialFields field_fcfht = new OracleSpecialFields();
                field_fcfht.Fieldname = "FCFHT";
                field_fcfht.FieldValue = fcfht;
                field_fcfht.Fieldtype = OracleType.Blob;
                lst.Add(field_fcfht);
                InsertSpecialInfo(constEnum.DBNAME.BDC, sql, lst);//插入数据
    }

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 要导出和导入Oracle数据库中的CLOBBLOB数据类型,可以使用以下方法: 1. 使用Oracle自带的exp和imp工具导出和导入整个数据库或特定表的数据。在导出时,使用参数“file=clob_data.dmp”或“file=blob_data.dmp”指定导出文件名。在导入时,使用参数“file=clob_data.dmp”或“file=blob_data.dmp”指定导入文件名。 2. 使用Oracle SQL Developer工具导出和导入特定表的数据。在导出时,选择要导出的表,右键点击选择“导出”选项,选择“导出数据”并选择“导出为LOB文件”。在导入时,选择要导入的表,右键点击选择“导入”选项,选择“导入数据”并选择“从LOB文件导入”。 3. 使用PL/SQL代码导出和导入CLOBBLOB数据。在导出时,使用SELECT语句查询CLOBBLOB列的值,并将其写入文件中。在导入时,使用INSERT语句将文件中的值插入到CLOBBLOB列中。 以上是几种常见的导出和导入Oracle数据库中CLOBBLOB数据的方法。具体使用哪种方法取决于具体情况和需求。 ### 回答2: Oracle是一个广泛使用的关系型数据库,其中包含了CLOB(字符大对象)和BLOB(二进制大对象)类型的数据。这些数据类型通常用于存储大型文本和图像等二进制数据。在Oracle中,导出和导入CLOBBLOB数据是非常常见的任务。本文将介绍如何导出和导入这些类型的数据。 首先,我们需要了解Oracle提供的导出工具是exp和expdp。exp是旧版工具,而expdp是新版工具。在导出CLOBBLOB数据时,我们建议使用expdp,因为它是专门为大量导出数据而设计的。下面我们来看看导出CLOB数据的方法: 1. 使用expdp导出 使用expdp命令导出CLOB数据需要指定以下参数: - expdp system/password tables=table_name directory=directory_name dumpfile=file_name.dmp lob_file=file_name.log EXCLUDE=STATISTICS 其中table_name是要导出的表名,directory_name是导出文件的路径,file_name是导出文件的名称,lob_file是LOB类型的文件的名称。 2. 使用SQL*Plus导出 我们也可以使用SQL*Plus命令导出CLOB数据。以下是步骤: 1)使用SQL*Plus连接到Oracle数据库。 2)使用以下命令在本机上创建目录 OBJECT_DIR: CREATE OR REPLACE DIRECTORY OBJECT_DIR AS 'C:\TEMP'; 3)使用以下命令导出CLOB数据: SET LONG 10000 SET PAGESIZE 0 SET LINESIZE 1000 SET FEEDBACK OFF SPOOL CLOB_Export.sql SELECT 'SELECT ' || column_name || ' FROM ' || table_name || ' WHERE ' || where_clause || ';' FROM all_tab_cols WHERE data_type = 'CLOB' AND table_name = 'TABLE_NAME'; SPOOL OFF 4)使用以下命令将生成的SQL脚本文件CLOB_Export.sql导出到本地目录: exp userid=username/password file=dumpfile.dmp owner=owner_name log=clob_export.log 接下来我们会介绍如何导入CLOBBLOB数据。 1. 使用impdp导入 使用impdp命令导入CLOB数据需要指定以下参数: - impdp system/password directory=directory_name dumpfile=file_name.dmp logfile=file_name.log tables=table_name 其中directory_name是导入文件的路径,file_name是导入文件的名称,table_name是要导入数据的表的名称。 2. 使用SQL*Plus导入 我们也可以使用SQL*Plus命令导入CLOB数据。以下是步骤: 1)使用SQL*Plus连接到Oracle数据库。 2)使用以下命令在本机上创建LOB的目录 LOB_DIR: CREATE OR REPLACE DIRECTORY LOB_DIR AS 'C:\TEMP'; 3)使用以下命令在Oracle中创建LOB表: CREATE TABLE lob_table ( lob_column CLOB ); 4)使用以下命令将LOB类型的文件loaded_file.xml导入到LOB表中: INSERT INTO lob_table (lob_column) VALUES (EMPTY_CLOB()); SELECT lob_column FROM lob_table FOR UPDATE; DECLARE infile BFILE :=BFILENAME('OBJECT_DIR', 'loaded_file.xml'); lob_loc CLOB; BEGIN DBMS_LOB.OPEN(lob_column, DBMS_LOB.LOB_READWRITE); DBMS_LOB.LOADFROMFILE(lob_column, infile, DBMS_LOB.GETLENGTH(infile)); DBMS_LOB.CLOSE(lob_column); COMMIT; END; / 以上是导出导入CLOB/BLOB数据的两种方法,根据实际情况可以选择使用expdp、impdp或SQL*Plus导出和导入。然而在导入CLOB/BLOB时,需要特别注意数据库版本以及LOB大小限制等问题。 ### 回答3: 在Oracle中,CLOBBLOB是用来存储大文本和二进制数据数据类型。有时候我们需要对这些数据进行导入和导出。在这篇文章中,我会介绍如何将CLOBBLOB数据导入和导出。 导出CLOB/BLOB数据Oracle中,可以使用DBMS_LOB包来导出CLOBBLOB数据。首先,我们需要使用SELECT语句来查询需要导出的数据。查询的结果会以一个CLOBBLOB对象的形式存在,然后我们可以把这个对象导出到一个文件中。以下是导出CLOBBLOB对象到文件中的步骤: 1.查询需要导出的数据 例如,我们可以使用以下SELECT语句来查询一个CLOB表中的数据: SELECT clob_column FROM clob_table; 2.将查询结果存储到变量中 为了方便将查询结果导出到文件中,我们需要将查询结果存储到一个变量中。我们可以使用PL/SQL或SQL*Plus来完成这个任务。以下是一个PL/SQL的例子: DECLARE my_data CLOB; BEGIN SELECT clob_column INTO my_data FROM clob_table; END; 3.将变量的值导出到文件中 使用DBMS_LOB包中的函数,可以将变量的值导出到文件中,以下是一个导出CLOB数据的例子: DECLARE my_data CLOB; my_file UTL_FILE.FILE_TYPE; BEGIN SELECT clob_column INTO my_data FROM clob_table; my_file := UTL_FILE.FOPEN('MY_DIR', 'my_file.txt', 'w'); DBMS_LOB.FILEEXPORT(my_file, my_data); UTL_FILE.FCLOSE(my_file); END; 注意: - 'MY_DIR'是Oracle指定的一个目录,需要在数据库中提前定义。 - 'my_file.txt'是导出文件的名称 - 'w'表示以覆盖模式写入文件 这个例子将会把查询出来的CLOB数据导出为txt文件。 导入CLOB/BLOB数据 同样的,我们可以使用DBMS_LOB包来导入CLOBBLOB数据。以下是导入CLOBBLOB数据的步骤: 1.读取文件内容 使用UTL_FILE包中的函数,可以读取文件的内容到一个变量中,例如以下SQL*Plus的命令: DEFINE my_file='my_file.txt' DECLARE my_data CLOB; my_file UTL_FILE.FILE_TYPE; BEGIN my_file := UTL_FILE.FOPEN('MY_DIR', '&my_file', 'r'); UTL_FILE.GET_LINE(my_file, my_data); UTL_FILE.FCLOSE(my_file); END; 注意: - 'my_file.txt'是要导入到数据库的文件名称 - MY_DIR是Oracle指定的一个目录,需要在数据库中提前定义。 2.将变量的值导入到数据库中 使用INSERT语句将变量的值插入到CLOB表中,例如以下的SQL*Plus命令: INSERT INTO clob_table (clob_column) VALUES (my_data); 注意: 在Oracle中,插入CLOBBLOB数据时,要使用专门的函数,例如: INSERT INTO clob_table (clob_column) VALUES (TO_LOB('some text')); 以上就是导出和导入CLOB/BLOB数据的步骤。当然,在实际操作中可能会遇到各种各样的问题,我们需要仔细阅读相关的文档,查找正确的解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值