ORACLE和DB2的问题

发布网友 发布时间:2022-04-19 17:41

我来回答

1个回答

热心网友 时间:2022-04-10 13:32

Oracle的Lob(包括Clob和Blob)的处理很费劲。如果你要存取的字段的Size小于4K,建议你用string(数据库对应nvarchar2(4096))或者byte[],并且考虑存取时压缩(如果压缩比很大的话)一下。另一个建议是,你既然使用Oracle,必是大的应用系统,大文本最好压缩后用Blob,毕竟占的空间和带宽要小很多,性能提高很明显。
如果大于4K的话,存贮时Oracle必须用事务和Select for update语句才能提交,获取时和其他类型一样。
我以Oracle data provider(ODP)、C#和Blob为例给个例子。如果你用ODBC或者OleDB,类似处理,细节查阅一下ODP的文档。最好去下载一下Oracle公司提供的最新的版本。
读取很简单:
OracleBlob blob = dr.GetOracleBlob(i);
byte[] buf;
blob.Position = 0;

buf = new byte[blob.Length];
blob.Read(buf,0,(int)blob.Length);
存储要启动事务:
OracleCommand updateCommand=new OracleCommand();
OracleCommand selectCommand=new OracleCommand();

updateCommand.Connection = selectCommand.Connection = oracleConnection1;

// 清除以前的数据
updateCommand.CommandType=CommandType.Text;
updateCommand.CommandText="UPDATE TableName SET BLOBCol = EMPTY_BLOB() WHERE ……";
updateCommand.Prepare();

selectCommand.CommandType = CommandType.Text;
selectCommand.CommandText = "SELECT BLOBCol FROM TableName WHERE …… FOR UPDATE";
selectCommand.Prepare();

updateCommand.ExecuteNonQuery();
OracleDataReader dr = null;

dr = selectCommand.ExecuteReader();
if (dr.Read())
{
OracleBlob blob = dr.GetOracleBlob(0);
if (blob!=OracleClob.Null)
{
blob.BeginChunkWrite();
blob.Position = 0;

blob.Write(bytes,0,bytes.Length);
blob.EndChunkWrite();
blob.Flush();
blob.Close();
}
}
要注意捕捉例外,出现例外后要回滚事务。
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com