using
System;
using
System.Data.OracleClient;
using
System.IO;
using
System.Drawing;
using
System.Drawing.Imaging;
using
Microsoft.Win32;
namespace
blog.csdn.net.zhangyuk
{
///<summary>
///
/// Oracle Lob
对象操作类
///
/// 1
、将文件内容存入 Lob 对象
/// 2
、将图片存入 Lob 对象
/// 3
、将 Lob 对象保存到临时文件,返回临时文件名
/// 4
、将 Lob 对象读入 Bitmap,返回 Bitmap 对象
///
///
例子:
///
/// OracleConnection conn = YourConnection.getConnection();
/// OracleCommand command = conn.CreateCommand();
/// command.CommandText = " SELECT YourLobField FROM YourTableName FOR UPDATE ";
/// OracleDataReader dr = command.ExecuteReader();
/// if( dr.Read() )
/// {
/// OracleLob lob = dr.GetOracleLob(0);
///
/// OracleLobFunctions.GetLobFromImage( lob, YourImageObject );
///
/// lob.Close();
/// }
///
///</summary>
public class OracleLobFunctions
{
///<summary>
///
将文件内容填入Lob对象
///</summary>
///<param name="lob">
待填充的 Oracle Lob 对象
</param>
///<param name="FileName">
待读取文件的文件名
</param>
public static void GetLobFromFile( OracleLob lob, string FileName )
{
if( lob == null ) return;
Stream sr = null;
try
{
//
清除 Lob 数据
lob.SetLength(0);
if( !FileName.Equals( string.Empty ) )
{
//
只读打开文件流
sr = new FileStream( FileName, FileMode.Open, FileAccess.Read );
//
定义缓冲区大小
const int size = 1024*1024;
byte[] bytes = new byte[ size ];
//
读取文件内容,写入 Lob 对象
int numBytes;
while((numBytes = sr.Read(bytes, 0, size)) > 0)
lob.Write(bytes, 0, numBytes);
}
}
catch
{
throw;
}
finally
{
lob.Flush();
//
关闭文件流
if( sr != null ) sr.Close();
}
}
///<summary>
///
将Image填入Lob对象
///</summary>
///<param name="lob">
待填充的 Oracle Lob 对象
</param>
///<param name="img">Image
对象
</param>
public static void GetLobFromImage( OracleLob lob, Image img )
{
if( lob == null ) return;
try
{
if( img != null )
{
//
将 image 写入 lob 对象
img.Save( lob, ImageFormat.Jpeg );
}
else
{
//
清除 lob 对象内容
lob.SetLength(0);
}
lob.Flush();
}
catch
{
throw;
}
}
///<summary>
///
将 Lob 对象保存到临时文件,返回临时文件名
///</summary>
///<param name="lob">Oracle Lob
对象
</param>
///<returns>
临时文件名
</returns>
public static string SaveLobToTmpFile( OracleLob lob )
{
string FileName = string.Empty;
FileStream sw = null;
try
{
if( lob != OracleLob.Null && lob.Length > 0 )
{
//
使用 IE 的临时目录而不使用环境变量定义的临时目录,好处是可以自动清理。
RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"SOFTWARE/Microsoft/Windows/CurrentVersion/Internet Settings/Cache/Paths");
string tempFileName = (String)rk.GetValue("Directory") + @"/OracleLobViewer.tmp";
//string tempFileName = Path.GetTempFileName();
//
创建临时文件
sw = new FileStream( tempFileName, FileMode.OpenOrCreate );
//
定义缓冲区
const int size = 1024*1024;
byte[] bytes = new byte[size];
//
将 Lob 内容写入临时文件
int numBytes;
while((numBytes = lob.Read(bytes, 0, size)) > 0)
sw.Write(bytes, 0, numBytes);
//
返回临时文件名
FileName = tempFileName;
}
return FileName;
}
catch
{
throw;
}
finally
{
//
关闭文件流
if( sw != null ) sw.Close();
}
}
///<summary>
///
将 Lob 对象读入 Bitmap
///</summary>
///<param name="lob">Oracle Lob
对象
</param>
///<returns>Bitmap
对象
</returns>
public static Bitmap SaveLobToImage( OracleLob lob )
{
Bitmap img = null;
try
{
if( lob != OracleLob.Null && lob.Length > 0 )
{
img = Bitmap.FromStream( lob ) as Bitmap;
}
return img;
}
catch
{
throw;
}
}
}
}