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”文件里的數據庫連接字符串。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM