OracleClient, Blob, 32K, ORA-01460

博客介绍了使用OracleClient处理clob/blob的三种方法,即OracleDataAdapter、OracleCommand和使用temporery LOB。同时指出使用前两种方法处理大于32K的blob时会抛出ORA - 01460错误,并给出了谷歌到的解决办法链接以及OracleLob相关链接。

使用OracleClient处理clob/blob时可以有三种方法:
1.  OracleDataAdapter

ContractedBlock.gif ExpandedBlockStart.gif
None.gifpublic void writeDataWithDA()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
InBlock.gif           FileInfo fi 
= new FileInfo("c:/temp/testfile.txt");
InBlock.gif           StreamReader sr 
= new StreamReader(fi.FullName);
InBlock.gif           String clob 
= sr.ReadToEnd();
InBlock.gif           sr.Close();
InBlock.gif 
InBlock.gif           OracleDataAdapter da 
= new OracleDataAdapter("SELECT ID, TEXT FROM CLOBTEST",ConnectionString);
InBlock.gif
InBlock.gif           DataTable dt 
= new DataTable();
InBlock.gif
InBlock.gif           
// get the schema
InBlock.gif
           da.FillSchema(dt, SchemaType.Source);
InBlock.gif
InBlock.gif           OracleCommandBuilder cb 
= new OracleCommandBuilder(da);
InBlock.gif
InBlock.gif           
int id = 2;
InBlock.gif
InBlock.gif           
// create a row containing the data
InBlock.gif
           DataRow row = dt.NewRow();
InBlock.gif           row[
"ID"= id;
InBlock.gif           row[
"TEXT"= clob;
InBlock.gif
InBlock.gif           dt.Rows.Add(row);
InBlock.gif 
InBlock.gif           
// update the table
InBlock.gif
           da.Update(dt);
ExpandedBlockEnd.gif}

None.gif
None.gif

2. OracleCommand

ContractedBlock.gif ExpandedBlockStart.gif
None.gifpublic void writeDataWithCommand()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif           FileInfo fi 
= new FileInfo("c:/temp/testfile.txt");
InBlock.gif           StreamReader sr 
= new StreamReader(fi.FullName);
InBlock.gif           String tempBuff 
= sr.ReadToEnd();
InBlock.gif           sr.Close();
InBlock.gif
InBlock.gif           
using(OracleConnection conn = new OracleConnection(ConnectionString))
ExpandedSubBlockStart.gifContractedSubBlock.gif           
dot.gif{
InBlock.gif                      conn.Open();
InBlock.gif                      Console.WriteLine(
"Connecteddot.gif") ;
InBlock.gif                      String strSQL 
= "INSERT INTO CLOBTEST (ID,TEXT) VALUES (1,:TEXT_DATA) ";
InBlock.gif
InBlock.gif                      OracleParameter parmData 
= new OracleParameter();
InBlock.gif                      parmData.Direction 
= ParameterDirection.Input;
InBlock.gif                      parmData.OracleType 
= OracleType.Clob;
InBlock.gif                      parmData.ParameterName 
= "TEXT_DATA";
InBlock.gif                      parmData.Value 
= tempBuff;
InBlock.gif 
InBlock.gif                      OracleCommand cm 
= new OracleCommand();
InBlock.gif                      cm.Connection 
= conn;
InBlock.gif                      cm.Parameters.Add(parmData);
InBlock.gif                      cm.CommandText 
= strSQL;
InBlock.gif                      cm.ExecuteNonQuery(); 
InBlock.gif
InBlock.gif                      conn.Close();
ExpandedSubBlockEnd.gif           }
 
InBlock.gif
InBlock.gif           Console.WriteLine(
"Done!") ;
ExpandedBlockEnd.gif}

None.gif
None.gif

3. 使用 temporery LOB

ContractedBlock.gif ExpandedBlockStart.gif
None.gifpublic void writeWithTempBlob()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif           FileInfo fi 
= new FileInfo("c:/temp/testfile.txt");
InBlock.gif           StreamReader sr 
= new StreamReader(fi.FullName);
InBlock.gif           String tempBuff 
= sr.ReadToEnd();
InBlock.gif           sr.Close();
InBlock.gif 
InBlock.gif           
using(OracleConnection conn = new OracleConnection(ConnectionString))
ExpandedSubBlockStart.gifContractedSubBlock.gif           
dot.gif{
InBlock.gif                      conn.Open();
InBlock.gif                      Console.WriteLine(
"Connecteddot.gif") ;
InBlock.gif                      OracleTransaction tx 
= conn.BeginTransaction();
InBlock.gif
InBlock.gif                      OracleCommand tempcmd 
= conn.CreateCommand();
InBlock.gif                      tempcmd.Transaction 
= tx;
InBlock.gif                      tempcmd.CommandText 
= "declare xx clob; begin dbms_lob.createtemporary(xx, false, 0); :tempclob := xx; end;";
InBlock.gif
InBlock.gif                      tempcmd.Parameters.Add(
new OracleParameter("tempclob",
InBlock.gif                                 OracleType.Clob)).Direction 
= ParameterDirection.Output;
InBlock.gif                      tempcmd.ExecuteNonQuery();
InBlock.gif
InBlock.gif                      
//get the temp lob object
InBlock.gif
                      OracleLob tempLob = (OracleLob)tempcmd.Parameters[0].Value;
InBlock.gif
InBlock.gif                      
//transform into byte array
InBlock.gif
                      System.Text.Encoding enc = Encoding.Unicode;          //MUST be unicode encoded!
InBlock.gif
                      Byte[] b = enc.GetBytes(tempBuff);
InBlock.gif
InBlock.gif                      tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);
InBlock.gif                      tempLob.Write(b,
0,b.Length);
InBlock.gif                      tempLob.EndBatch();
InBlock.gif
InBlock.gif                      OracleCommand cmd 
= conn.CreateCommand();
InBlock.gif                      cmd.Transaction 
= tx;
InBlock.gif                      cmd.CommandText 
= "INSERT INTO CLOBTEST (ID, TEXT) VALUES (:ID, :TEXT)";
InBlock.gif                      cmd.Parameters.Add(
"ID"3);
InBlock.gif                      cmd.Parameters.Add(
"TEXT", OracleType.Clob).Value = tempLob;           //insert the temp lob
InBlock.gif
                      cmd.ExecuteNonQuery();
InBlock.gif
InBlock.gif                      tx.Commit(); 
InBlock.gif
ExpandedSubBlockEnd.gif           }

InBlock.gif
InBlock.gif           Console.WriteLine(
"Done!") ;
ExpandedBlockEnd.gif}

None.gif
None.gif


当使用1,2 处理的blob大于32K时会拋出
ORA-01460: unimplemented or unreasonable conversion
requested

google到的解決法子
http://p2p.wrox.com/topic.asp?TOPIC_ID=7743

OracleLob 相關
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdataoracleclientoraclelobclasswritetopic.asphttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdataoracleclientoraclelobclasswritetopic.asp



 

转载于:https://www.cnblogs.com/z_true/archive/2005/10/13/253612.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值