標籤:
摘要
最近利用NHibernate映射類型為Clob欄位在插入資料時發現當字元的位元組數(一個半形字元一個位元組,一個全形字元兩個位元組)在2000-4000之間時報錯(ORA-01461:僅可以插入LONG列的LONG值賦值)。經過不斷尋找資料和自己的實驗該問題終於得到解決,下邊我將自己的心得給大家做一個分享。
準備
系統內容 xp+.net2.0+oracle9i
表結構(由於是測試,表結構隨便建了一張) XX
| 欄位名 |
類型 |
| ID |
VARCHAR2(70) |
| TEST |
CLOB |
測試 方式1:直接將CLOB的值拼字在SQL語句中。
代碼:
string id = Guid.NewGuid().ToString();OracleCommand cmd = Conn.CreateCommand();cmd.CommandText = "insert into xx(id,test) values(‘" + id + "‘,‘" + data + "‘)";// data是一個變數,儲存你要插入的字串cmd.ExecuteNonQuery();
情況分析:
當data的長度大於4000時報錯(ORA-01704:文字字串過長),小於或等於4000時正常插入。
原因分析:
之所以會出現長度大於4000時報錯,是因為Oracle中有SQL語句中兩個單引號之間的字元數不能大於4000的限制。‘" + data + "‘ data在sql語句之間,當data的值大於4000個位元組時就會報錯。
解決辦法:
這種方式比較棘手,但有更好的方式,下邊會講到 。
方式2:採用參數形式。 代碼:
string id = Guid.NewGuid().ToString();OracleCommand cmd = Conn.CreateCommand();cmd.CommandText = "insert into xx(id,test) values(‘" + id + "‘,:p1)";OracleParameter p1 = new OracleParameter("p1", OracleType.Clob);p1.Value = data; // data是一個變數,儲存你要插入的字串cmd.Parameters.Add(p1);cmd.ExecuteNonQuery();
情況分析:
採用這種方式能夠正常插入。所以推薦用這種方式。
原因分析:
無
解決辦法:
無
方式3:採用參數形式,但是參數類型寫為OracleType. NVarChar
代碼:
string id = Guid.NewGuid().ToString();OracleCommand cmd = Conn.CreateCommand();cmd.CommandText = "insert into xx(id,test) values(‘" + id + "‘,:p1)";OracleParameter p1 = new OracleParameter("p1", OracleType. NVarChar);p1.Value = data; // data是一個變數,儲存你要插入的字串 cmd.Parameters.Add(p1);cmd.ExecuteNonQuery();
情況分析:
為什麼要寫這種方式,因為這種方式和採用NHibernate的方式很相似,先看看在這種方式會產生什麼情況。當data的位元組數在0-2000之間時正常插入,大於4000時也正常插入,但在2000-4000時則失敗,報錯(ORA-01461:僅可以插入LONG列的LONG值賦值)
原因分析:
沒有採用對應的Oracle類型。
解決辦法:
採用OracleType.Clob
Oracle中Clob類型處理解析