.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那邊要一致!

  


免責聲明!

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



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