资讯   |   开发   |   选机中心   |   产品大全 | IBM | 惠普 | 联想 | 戴尔 | 苹果 | 神舟
更多: | 华硕 | 明基 | 方正 | 紫光 | TCL | 夏新 | 联宝 | 宏碁 | 七喜 | 长城 | 清华同方 | 海尔 | 三星 | 东芝 | 索尼 | 富士通 | LG | 技术 | ddnoon
当前位置:笔记本 > 软件开发 >
Advertisement
文章正文

如何获取Oracle数据库中的CLOB字段的值,为什么我得到的是乱码一堆,不管存入表中的是中文还是英文.

类型:转载   责任编辑:asp.net   日期:2007/05/23


热门软件下载:


   

下面存入数据时的代码:  
  System.Text.Encoding   unicode=System.Text.Encoding.UTF8;  
  byte[]   tempbuff=unicode.GetBytes(strValue);  
  OracleConnection   cnn=new   OracleConnection(DataAccessOracle.cnnstring);  
  cnn.Open();  
  OracleTransaction   tx   =   cnn.BeginTransaction();  
  OracleCommand   cmd   =   cnn.CreateCommand();  
  cmd.Transaction   =   tx;  
  cmd.Connection=cnn;  
  cmd.CommandText   =   "declare   xx   blob;   begin   dbms_lob.createtemporary(xx,   false,   0);   :tempblob   :=   xx;   end;";  
  cmd.Parameters.Add(new   OracleParameter("tempblob",   OracleType.Blob)).Direction   =   ParameterDirection.Output;  
  cmd.ExecuteNonQuery();  
   
  OracleLob   tempLob=(OracleLob)cmd.Parameters[0].Value;  
  tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);  
  tempLob.Write(tempbuff,0,tempbuff.Length);  
  tempLob.EndBatch();  
   
  string   strOracle="insert   into   pmis.zzzz(id,name,value1)   values(4,z,:value1)";  
   
  OracleParameter   objPara=new   OracleParameter("value1",OracleType.Clob);  
  objPara.Value=tempLob;  
  cmd=new   OracleCommand(strOracle,cnn);  
  cmd.Parameters.Add(objPara);  
  cmd.Transaction=tx;  
  cmd.ExecuteNonQuery();  
  tx.Commit();  
  cnn.Close();  
   
  读取时的代码:  
  OracleConnection   cnn=new   OracleConnection(DataAccessOracle.cnnstring);  
  cnn.Open();  
  OracleTransaction   tx   =   cnn.BeginTransaction();  
  OracleCommand   cmd   =   new   OracleCommand("select   *   from   pmis.zzzz   where   id=4",cnn);  
  cmd.Transaction=tx;  
  OracleDataReader   dr   =   cmd.ExecuteReader();  
  dr.Read();  
  MessageBox.Show(dr.GetOracleLob(2).Value.ToString());  
  tx.Commit();  
  dr.Close();  
  cnn.Close();  
   
  无论我输入时用GB2312还是Unicode还是UTF8显示时都是乱码,在sqlplus显示时也是乱码,请教高手如何解决这个问题,是不是存入表中的时候编码就不对?  
  这个问题已经折磨我好长时间了,我很急于解决,先谢了!

网友回答:

发表者:jellypudding

public   static   void   WriteLob(string   table_name,string   table_id,int   id,int   column,string   content)    
  {    
  OracleConnection   myCn   =   new   OracleConnection(cnnstring);                
  OracleCommand   myCmd   =   new   OracleCommand();    
  try    
  {    
  myCn.Open();                    
  }    
  catch(System.Data.OracleClient.OracleException   e)    
  {    
  throw   new   Exception(e.Message);    
  }                
  OracleTransaction   myTrans   =   myCn.BeginTransaction();    
  try    
  {                                                
  myCmd.Connection   =   myCn;                    
  myCmd.Transaction   =   myTrans;    
   
  myCmd.CommandText   =   "SELECT   *   FROM   "+   table_name   +"   where   "+   table_id   +"   =   "+   id   +"   FOR   UPDATE";    
  OracleDataReader   reader   =   myCmd.ExecuteReader();    
  using(reader)    
  {    
  reader.Read();    
  OracleLob   CLOB   =   reader.GetOracleLob(column);//column为lob类型所在列    
   
  Encoding   unicode=Encoding.Unicode;  
  byte[]   buffer=unicode.GetBytes(content);  
   
  if(buffer.Length   %   2   ==0)    
  CLOB.Write(buffer,   0,   buffer.Length);       //这里的参数必须为偶数    
  else    
  CLOB.Write(buffer,   0,   (buffer.Length   -   1));    
  //CLOB.Position     =   0;    
  myTrans.Commit();    
  }    
  }    
  catch(System.Data.OracleClient.OracleException   e)    
  {                
  myTrans.Rollback();    
  throw   new   Exception(e.Message);    
  }    
  catch(Exception   ex)  
  {  
  throw   new   Exception(ex.Message);  
  }  
  finally    
  {    
  myCmd.Dispose();    
  myCn.Close();    
  }    
  }    
  public   static   string   ReadLob(string   table_name,string   table_id,int   id,int   column)    
  {    
  OracleConnection   myCn   =   new   OracleConnection(cnnstring);                
  OracleCommand   myCmd   =   new   OracleCommand();    
  try    
  {    
  myCn.Open();                    
  }    
  catch(System.Data.OracleClient.OracleException   e)    
  {    
  throw   new   Exception(e.Message);    
  }                
  OracleTransaction   myTrans   =   myCn.BeginTransaction();    
  try    
  {                                                
  myCmd.Connection   =   myCn;                    
  myCmd.Transaction   =   myTrans;    
  myCmd.CommandText   =   "SELECT   *   FROM   "+   table_name   +"   where   "+   table_id   +"   =   "+   id   +"   FOR   UPDATE";    
  OracleDataReader   reader   =   myCmd.ExecuteReader();    
  using(reader)    
  {    
  reader.Read();    
  OracleLob   CLOB   =   reader.GetOracleLob(column);    
  int[]   content   =   new   int[(int)CLOB.Length];    
  byte[]   buffer   =   new   byte[(int)CLOB.Length];    
                               
  CLOB.Read(buffer,0,(int)CLOB.Length);  
       
  Encoding   unicode=Encoding.Unicode;  
  string   final=unicode.GetString(buffer);  
   
  myTrans.Commit();    
  return   final;    
  }    
  }    
  catch(System.Data.OracleClient.OracleException   e)    
  {                
  myTrans.Rollback();    
  throw   new   Exception(e.Message);    
  }    
  finally    
  {    
  myCmd.Dispose();    
  myCn.Close();    
  }    
  }    
  }


 

 
热门推荐笔记本: 三星笔记本
相关文章:
webmaster:popbb@126.com   最佳浏览:1024X768 MSIE
©2007 popbb.net All Rights Reserved