Oracle中Clob類型處理解析

來源:互聯網
上載者:User

系統內容 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

  下邊採用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; }

  }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.