65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 C# 将 CLOB 数据插入 Oracle

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.57/5 (12投票s)

2006年4月4日

CPOL

1分钟阅读

viewsIcon

251883

使用 C# 将 CLOB 数据插入 Oracle 表。

引言

即使是最新版本的 Oracle 数据库,在存储和检索表中的数据时,字符串大小也有限制。目前,此限制为 4,000 个字符。在 8.1 版本之前,这个限制是 2,000 个。虽然这个限制对于存储短字符串和单词不会造成任何问题,但当程序员需要在一个记录中存储大量文本时,它就成为一个严重的障碍。

Oracle 提供了一种名为 Character Large Object (CLOB) 的特殊列数据类型,允许存储最多 4 兆字节的字符数据。然而,将如此大量的数据存储在表中非常困难。Oracle 实际存储在表中的只是指向数据存储中实际数据所在位置的指针。这种技术是更复杂的过程的根源,首先需要将数据存储在 CLOB 列中,然后存储其他“原始”数据类型。仍然可以将字符串传递到 SQL INSERT 语句中,插入到具有 CLOB 数据类型的列中,但只有长度不超过 4,000 个字符的字符串才能以这种方式存储。

为了存储大量的文本,需要一个包含多个步骤的过程。以下是一个类示例,说明如何完成此操作

using System;

namespace InsertingCLOB
{
    public class clsOracle
    {     
        private System.Data.OracleClient.OracleConnection connOracle;
        private System.Data.OracleClient.OracleDataReader rstOracle;
        private System.Data.OracleClient.OracleCommand sqlCommandOracle;
        private System.Data.OracleClient.OracleTransaction txn; 
        private System.Data.OracleClient.OracleLob clob;    
        
        public clsOracle()    
        {
            string p_conn_db= "Data Source=" + OracleIP + ";User ID=" + 
                              OracleUserName + ";PASSWORD=" + OraclePassword + ";";
            connOracle = new System.Data.OracleClient.OracleConnection(p_conn_db);
            connOracle.Open();
        }   

        public void InsertRecord(string SQLStatement)
        { 
            if (SQLStatement.Length>0)
            {
                if(connOracle.State.ToString().Equals("Open"))
                { 
                    sqlCommandOracle = 
                      new System.Data.OracleClient.OracleCommand(SQLStatement,connOracle);
                    sqlCommandOracle.ExecuteScalar(); 
                }
            }
        }

        public void InsertCLOB(string SQLStatement, string str)    
        {
            if (SQLStatement.Length>0)
            {
                if(connOracle.State.ToString().Equals("Open"))
                {                        
                    byte[] newvalue = System.Text.Encoding.Unicode.GetBytes(str);
                    sqlCommandOracle= 
                      new System.Data.OracleClient.OracleCommand(SQLStatement,connOracle);
                    rstOracle = sqlCommandOracle.ExecuteReader();
                    rstOracle.Read();
                    txn = connOracle.BeginTransaction();
                    clob = rstOracle.GetOracleLob(0);
                    clob.Write(newvalue, 0, newvalue.Length);
                    txn.Commit();
                }
            }
        }
        public void CloseDatabase()
        {
            connOracle.Close();    
            connOracle.Dispose(); 
        }   
    }
}

将这个名为 clsOracle.cls 的类包含在你的项目中。现在,创建一个“保存”按钮来调用这个类,并使用下面的代码

private void btnSave_Click(object sender, System.EventArgs e)
{
    clsOracle db=new clsOracle();   

    // example for primary key    
    string field_id = "1";         
    // insert 2 characters for addresing    
    string field_temp = "XX";
    
    string sql = "Insert into table_nm values('" + field_id + 
                 "', '" + field_temp + "')"; 
    db.InsertRecord(sql); 

    sql="select news_text from table_nm +
    "WHERE field_nm'" + field_id + "' FOR UPDATE";
    
    db.InsertCLOB(sql, txtCLOBData.Text.ToString()); 
    db.CloseDatabase();
}

关于 CLOB 地址的特性,我们需要先插入一条记录才能对其进行更新。然后,任务就完成了……

© . All rights reserved.