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

Jelly1016 2004-10-13 04:24:41
下面存入数据时的代码:
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显示时也是乱码,请教高手如何解决这个问题,是不是存入表中的时候编码就不对?
这个问题已经折磨我好长时间了,我很急于解决,先谢了!
...全文
255 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
jellypudding 2004-10-16
  • 打赏
  • 举报
回复
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();
}
}
}
本课程详细讲解了以下内容:    1.jsp环境搭建及入门、虚拟路径和虚拟主机、JSP执行流程    2.使用Eclipse快速开发JSP、编码问题、JSP页面元素以及request对象、使用request对象实现注册示例    3.请求方式的编码问题、response、请求转发和重定向、cookie、session执行机制、session共享问题     4.session与cookie问题及application、cookie补充说明及四种范围对象作用域     5.JDBC原理及使用Statement访问数据库、使用JDBC切换数据库以及PreparedStatement的使用、Statement与PreparedStatement的区别     6.JDBC调用存储过程和存储函数、JDBC处理大文本CLOB及二进制BLOB类型数据     7.JSP访问数据库、JavaBean(封装数据和封装业务逻辑)     8.MVC模式与Servlet执行流程、Servlet25与Servlet30的使用、ServletAPI详解与源码分析     9.MVC案例、三层架构详解、乱码问题以及三层代码流程解析、完善Service和Dao、完善View、优化用户体验、优化三层(加入接口和DBUtil)    1 0.Web调试及bug修复、分页SQL(Oracle、MySQL、SQLSERVER)     11.分页业务逻辑层和数据访问层Service、Dao、分页表示层Jsp、Servlet     12.文件上传及注意问题、控制文件上传类型和大小、下载、各浏览器下载乱码问题     13.EL表达式语法、点操作符和括号操作符、EL运算、隐式对象、JSTL基础及set、out、remove     14.过滤器、过滤器通配符、过滤器链、监听器     15.session绑定解绑、钝化活化     16.以及Ajax的各种应用     17. Idea环境下的Java Web开发

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧