类型:转载 责任编辑: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显示时也是乱码,请教高手如何解决这个问题,是不是存入表中的时候编码就不对?
这个问题已经折磨我好长时间了,我很急于解决,先谢了!
网友回答:
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();
}
}
}