Oracle中Clob類型處理解析最近利用NHibernate映射類型為Clob字段在插入數據時發現當字符的字節數(一個半角字符一個字節,一個全角字符兩個字節)在 2000-4000之間時報錯(ORA-01461:僅可以插入LONG列的LONG值賦值)。經過不斷查找資料和自己的試驗該問題終于得到解決,下邊我將自己的心得給大家做一個分享。
系統環境 xp+.net2.0+oracle9i
表結構(由于是測試,表結構隨便建了一張) XX
字段名 類型 ID VARCHAR2(70)TEST CLOB
  string id = Guid.NewGuid().ToString();
OracleCommand cmd = Conn.CreateCommand();
    // data是一個變量,存儲你要插入的字符串
cmd.CommandText = "insert into xx(id,test) values('" + id + "','" + data + "')";
cmd.ExecuteNonQuery();
當data的長度大于4000時報錯(ORA-01704:文字字符串過長),小于或等于4000時正常插入。
之所以會出現長度大于4000時報錯,是因為Oracle中有SQL語句中兩個單引號之間的字符數不能大于4000的限制。'" + data + "' data在sql語句之間,當data的值大于4000個字節時就會報錯。
這種方式比較棘手,但有更好的方式,下邊會講到 。
  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();
采用這種方式能夠正常插入。所以推薦用這種方式。
無
無
  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
下邊采用NHibernate插入數據,NHibernate具體怎用不在本次討論范圍。
NHibernate采用的版本為1.2.1.4000。
下邊大至把簡要配置寫下。
App.config
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="nhibernate" type="System.Configuration.NamueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" /> </configSections> <nhibernate> <add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" /> <add key="hibernate.connection.driver_class" value="NHibernate.Driver.OracleClientDriver" /> <add key="hibernate.connection.isolation" value="ReadCommitted"/> <add key="hibernate.dialect" value="NHibernate.Dialect.Oracle9Dialect" /> <add key="hibernate.connection.connection_string" value="Data Source=Orcl_192.168.0.232;User ID =icqs_test;Password=icqs_test" /> <add key="show_sql" value="true" /> <add key="hibernate.adonet.batch_size" value="100" /> </nhibernate> </configuration>
  xx.cs  using System;  using System.Collections.Generic;  using System.Text;  namespace Test.Enties  {    [Serializable]    public class Xx    {     public Xx()     {     }     private string id;     public virtual string Id     {       get { return id; }       set { id = value; }     }    } }
新聞熱點
疑難解答