最近在做項目中用到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那邊要一致!