使用OracleClient处理clob/blob时可以有三种方法:
1. OracleDataAdapter
public void writeDataWithDA()
{
FileInfo fi = new FileInfo("c:/temp/testfile.txt");
StreamReader sr = new StreamReader(fi.FullName);
String clob = sr.ReadToEnd();
sr.Close();
OracleDataAdapter da = new OracleDataAdapter("SELECT ID, TEXT FROM CLOBTEST",ConnectionString);
DataTable dt = new DataTable();
// get the schema
da.FillSchema(dt, SchemaType.Source);
OracleCommandBuilder cb = new OracleCommandBuilder(da);
int id = 2;
// create a row containing the data
DataRow row = dt.NewRow();
row["ID"] = id;
row["TEXT"] = clob;
dt.Rows.Add(row);
// update the table
da.Update(dt);
}
2. OracleCommand
public void writeDataWithCommand()
{
FileInfo fi = new FileInfo("c:/temp/testfile.txt");
StreamReader sr = new StreamReader(fi.FullName);
String tempBuff = sr.ReadToEnd();
sr.Close();
using(OracleConnection conn = new OracleConnection(ConnectionString))
{
conn.Open();
Console.WriteLine("Connected") ;
String strSQL = "INSERT INTO CLOBTEST (ID,TEXT) VALUES (1,:TEXT_DATA) ";
OracleParameter parmData = new OracleParameter();
parmData.Direction = ParameterDirection.Input;
parmData.OracleType = OracleType.Clob;
parmData.ParameterName = "TEXT_DATA";
parmData.Value = tempBuff;
OracleCommand cm = new OracleCommand();
cm.Connection = conn;
cm.Parameters.Add(parmData);
cm.CommandText = strSQL;
cm.ExecuteNonQuery();
conn.Close();
}
Console.WriteLine("Done!") ;
}
3. 使用 temporery LOB
public void writeWithTempBlob()
{
FileInfo fi = new FileInfo("c:/temp/testfile.txt");
StreamReader sr = new StreamReader(fi.FullName);
String tempBuff = sr.ReadToEnd();
sr.Close();
using(OracleConnection conn = new OracleConnection(ConnectionString))
{
conn.Open();
Console.WriteLine("Connected") ;
OracleTransaction tx = conn.BeginTransaction();
OracleCommand tempcmd = conn.CreateCommand();
tempcmd.Transaction = tx;
tempcmd.CommandText = "declare xx clob; begin dbms_lob.createtemporary(xx, false, 0); :tempclob := xx; end;";
tempcmd.Parameters.Add(new OracleParameter("tempclob",
OracleType.Clob)).Direction = ParameterDirection.Output;
tempcmd.ExecuteNonQuery();
//get the temp lob object
OracleLob tempLob = (OracleLob)tempcmd.Parameters[0].Value;
//transform into byte array
System.Text.Encoding enc = Encoding.Unicode; //MUST be unicode encoded!
Byte[] b = enc.GetBytes(tempBuff);
tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);
tempLob.Write(b,0,b.Length);
tempLob.EndBatch();
OracleCommand cmd = conn.CreateCommand();
cmd.Transaction = tx;
cmd.CommandText = "INSERT INTO CLOBTEST (ID, TEXT) VALUES (:ID, :TEXT)";
cmd.Parameters.Add("ID", 3);
cmd.Parameters.Add("TEXT", OracleType.Clob).Value = tempLob; //insert the temp lob
cmd.ExecuteNonQuery();
tx.Commit();
}
Console.WriteLine("Done!") ;
}
当使用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