国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

Oracle中Clob類型處理解析

2024-08-29 13:03:48
字體:
來源:轉載
供稿:網友

Oracle中Clob類型處理解析最近利用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();
    // 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個字節時就會報錯。

解決辦法:

這種方式比較棘手,但有更好的方式,下邊會講到 。

方式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

  下邊采用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; }     }    } }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 博乐市| 陆川县| 慈溪市| 资阳市| 布尔津县| 山阳县| 青龙| 荆门市| 新闻| 焦作市| 镇康县| 滕州市| 博白县| 黔江区| 平江县| 成都市| 德州市| 太和县| 孙吴县| 泗阳县| 右玉县| 尚志市| 法库县| 营山县| 尖扎县| 崇州市| 新河县| 定南县| 文登市| 凭祥市| 英吉沙县| 石景山区| 翁源县| 潢川县| 普宁市| 突泉县| 文山县| 莫力| 门头沟区| 依兰县| 县级市|