Oracle中Clob与Blob字段的读取
2009-06-02 10:20
459 查看
Oracle中若以字符串的形式写入数据到Clob字段中,默认的长度为4000,最大可存储4G。
直接将字符串写入Clob字段中,则最大可写4000个字节;若要写入大的字符数据,可以将字符数据以二进制流的形式写入。
写入Clob(Blob代码):
OracleConnection conn = new OracleConnection(GetConfigUserConnectionString());
conn.Open();
OracleTransaction tran = conn.BeginTransaction();
string id = string.Empty;
OracleCommand command = null;
try
{
command = new OracleCommand();
command.Connection = conn;
double scale = 0;
if (ct.Scale.IndexOf(":") == -1)
{
scale = BasicOperate.GetDouble(ct.Scale, true);
}
else
{
scale = BasicOperate.GetDouble(ct.Scale.Substring(ct.Scale.IndexOf(":") + 1), true);
}
//在插入时先存一个空的empty_clob()[empty_blob()]
command.CommandText = string.Format(@"insert into chart(chartname,charttype,source,scale,producttime,"
+"xml_definition) values('{0}','{1}','{2}',{3},'{4}',empty_clob()) "
+"returning chartid into :rid",
ct.ChartName, ct.ChartType, ct.Source, scale, ct.ProductTime, ct.xmlDefinition);
command.Parameters.Add("rid", OracleDbType.Varchar2, 32).Direction = ParameterDirection.Output;
command.ExecuteNonQuery();
id = command.Parameters["rid"].Value.ToString();
//读入clob字段进行编辑
command.CommandText = string.Format("select xml_definition from chart where chartid='{0}' for update", id);
using (OracleDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
OracleClob clob = reader.GetOracleClob(0);//读入二进制对性
clob.Erase();//清空其中的数据
clob.Position = 0;
clob.BeginChunkWrite();//开始写入
int buffersize = 100;
int retval = 0;
byte[] bts = new byte[buffersize];
//将字符串序列化为二进制流
MemoryStream stream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, ct.xmlDefinition);
//将二进制流写入Clob字符中
stream.Seek(0, SeekOrigin.Begin);
retval = stream.Read(bts, 0, buffersize);
while (retval == buffersize)
{
clob.Write(bts, 0, buffersize);
retval = stream.Read(bts, 0, buffersize);
}
clob.Write(bts, 0, 100);
clob.EndChunkWrite();//结束写入
clob.Flush();//刷新
clob.Close();//关闭
}
reader.Close();
}
tran.Commit();
}
catch (Exception ex)
{
tran.Rollback();
//throw new Exception(ex.Message);
}
finally
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
}
读取Clob(blob)字段:
。。。
using (OracleDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
OracleClob clob = reader.GetOracleClob(0);//读取二进制字段
clob.Position = 0;//指向起点
byte[] tt = new byte[clob.Length];
clob.Read(tt, 0, (int)clob.Length);//将Clob读为二进制数据
MemoryStream ms = new MemoryStream(tt);
BinaryFormatter bb = new BinaryFormatter();
object oo = bb.Deserialize(ms);//反序列化取出字符数据
}}
直接将字符串写入Clob字段中,则最大可写4000个字节;若要写入大的字符数据,可以将字符数据以二进制流的形式写入。
写入Clob(Blob代码):
OracleConnection conn = new OracleConnection(GetConfigUserConnectionString());
conn.Open();
OracleTransaction tran = conn.BeginTransaction();
string id = string.Empty;
OracleCommand command = null;
try
{
command = new OracleCommand();
command.Connection = conn;
double scale = 0;
if (ct.Scale.IndexOf(":") == -1)
{
scale = BasicOperate.GetDouble(ct.Scale, true);
}
else
{
scale = BasicOperate.GetDouble(ct.Scale.Substring(ct.Scale.IndexOf(":") + 1), true);
}
//在插入时先存一个空的empty_clob()[empty_blob()]
command.CommandText = string.Format(@"insert into chart(chartname,charttype,source,scale,producttime,"
+"xml_definition) values('{0}','{1}','{2}',{3},'{4}',empty_clob()) "
+"returning chartid into :rid",
ct.ChartName, ct.ChartType, ct.Source, scale, ct.ProductTime, ct.xmlDefinition);
command.Parameters.Add("rid", OracleDbType.Varchar2, 32).Direction = ParameterDirection.Output;
command.ExecuteNonQuery();
id = command.Parameters["rid"].Value.ToString();
//读入clob字段进行编辑
command.CommandText = string.Format("select xml_definition from chart where chartid='{0}' for update", id);
using (OracleDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
OracleClob clob = reader.GetOracleClob(0);//读入二进制对性
clob.Erase();//清空其中的数据
clob.Position = 0;
clob.BeginChunkWrite();//开始写入
int buffersize = 100;
int retval = 0;
byte[] bts = new byte[buffersize];
//将字符串序列化为二进制流
MemoryStream stream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, ct.xmlDefinition);
//将二进制流写入Clob字符中
stream.Seek(0, SeekOrigin.Begin);
retval = stream.Read(bts, 0, buffersize);
while (retval == buffersize)
{
clob.Write(bts, 0, buffersize);
retval = stream.Read(bts, 0, buffersize);
}
clob.Write(bts, 0, 100);
clob.EndChunkWrite();//结束写入
clob.Flush();//刷新
clob.Close();//关闭
}
reader.Close();
}
tran.Commit();
}
catch (Exception ex)
{
tran.Rollback();
//throw new Exception(ex.Message);
}
finally
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
}
读取Clob(blob)字段:
。。。
using (OracleDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
OracleClob clob = reader.GetOracleClob(0);//读取二进制字段
clob.Position = 0;//指向起点
byte[] tt = new byte[clob.Length];
clob.Read(tt, 0, (int)clob.Length);//将Clob读为二进制数据
MemoryStream ms = new MemoryStream(tt);
BinaryFormatter bb = new BinaryFormatter();
object oo = bb.Deserialize(ms);//反序列化取出字符数据
}}
相关文章推荐
- Oracle中Clob与Blob字段的读取
- Oracle中Clob与Blob字段的读取
- dwr+oracle进行clob、blob字段插入、修改和读取
- 用java和oracle实现BLOB字段的字符串读取【转】
- 使用JAVA读取ORACLE BLOB字段实现上传下载
- java 读取Oracle的clob,blob转换为字符串
- Java 存储和读取 oracle CLOB 类型字段的实用方法
- Oracle中的大字段 Blob/Clob
- C# 连接 Oracle,读取Blob字段数据,存到文件中去,包括pdf等等
- JAVA读取Oracle中的blob图片字段并显示
- 用oracle的java存储过程实现BLOB字段的字符串读取
- 简单搞一下 System.Data.OracleClient调用带blob、clob等大字段类型参数的存储过程!
- Oracle中的BLOB和CLOB字段类型的区别
- Java 存储和读取 oracle CLOB 类型字段的实用方法
- Spring+Hibernate中处理Oracle的大字段(clob二进制\blob大字符串)
- oracle和mysql的Blob字段的读取和插入
- 用java和oracle实现BLOB字段的字符串读取【转】
- 如何解决 tomcat 下 oracle 缓冲池 读取 clob 字段内容 时的错误 "java.lang.ClassCastException: org.apache.commons.dbcp.DelegatingResultSet "
- Java 存储和读取 oracle CLOB 类型字段的实用方法
- 好记性不如烂笔头20-java对oracle的clob和blob字段的总结