100分悬赏!!ORACLE和DB2的问题!!oracle中的b
中的blob字段和clob字段,我通过程序插入数据时,需要进行多次提交么?
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(); } } 要注意捕捉例外,出现例外后要回滚事务。