C# 读写 Oracle BLOB 数据

 

None.gif using  System;
None.gif
using  System.Data.OracleClient;
None.gif
using  System.IO;
None.gif
None.gif
namespace  fenghua.Data.Oracle
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**//// <summary>
InBlock.gif    
/// Class1 的摘要说明。
ExpandedSubBlockEnd.gif    
/// </summary>

InBlock.gif    public class OracleLobData
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
private OracleConnection conn;
InBlock.gif        
public OracleLobData()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
//
InBlock.gif            
// TODO: 在此处添加构造函数逻辑
InBlock.gif            
//
ExpandedSubBlockEnd.gif
        }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//*
InBlock.gif         * 在调用此函数之前需要写插入一个字符串到 BLOB 中比如:
InBlock.gif         * Select some data.
InBlock.gif         * Table Schema:
InBlock.gif         *        "CREATE TABLE tablewithlobs (a int, b BLOB, c CLOB, d NCLOB)";
InBlock.gif         *        "INSERT INTO tablewithlobs values (1, 'AA', 'AAA', N'AAAA')";
InBlock.gif         * 否则程序会在 OracleLob tempLob    = reader.GetOracleLob(0) 处出错。
ExpandedSubBlockEnd.gif         
*/

ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif        
/// 文件写入到 Oracle Blob 字段中。
InBlock.gif        
/// </summary>
InBlock.gif        
/// <param name="idData">id 值</param>
InBlock.gif        
/// <param name="fileName">文件名</param>
InBlock.gif        
/// <param name="id">id 键</param>
InBlock.gif        
/// <param name="blob">blob 键</param>
ExpandedSubBlockEnd.gif        
/// <param name="tableName">表名</param>

InBlock.gif        public void WriteBlob(int idData, string fileName, string id, string blob, string tableName)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
string connString = "server=oratest;User ID=kttest;Password=test";
InBlock.gif            
using(conn = new OracleConnection(connString))
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
try
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    conn.Open();
InBlock.gif                    OracleCommand cmd 
= conn.CreateCommand();
InBlock.gif
InBlock.gif                    
// 利用事务处理(必须)
InBlock.gif
                    OracleTransaction transaction = cmd.Connection.BeginTransaction();
InBlock.gif                    cmd.Transaction 
= transaction;
InBlock.gif
InBlock.gif                    
// 获得 OracleLob 指针
InBlock.gif
                    cmd.CommandText = "select " + blob + " from " + tableName + " where " + id + " = " + idData + " FOR UPDATE";
InBlock.gif                    OracleDataReader reader 
= cmd.ExecuteReader();
InBlock.gif                    
using(reader)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        
//Obtain the first row of data.
InBlock.gif
                        reader.Read();
InBlock.gif                        
//Obtain a LOB.
InBlock.gif
                        OracleLob tempLob    = reader.GetOracleLob(0);
InBlock.gif
InBlock.gif                        
// 将文件写入 BLOB 中
InBlock.gif
                        FileStream fs = new FileStream(fileName,FileMode.Open);
InBlock.gif                        tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);
InBlock.gif                        
int length = 10485760;
InBlock.gif                        
byte[] Buffer = new byte[length];
InBlock.gif                        
int i;
InBlock.gif                        
while((i = fs.Read(Buffer,0,length)) > 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif                        
dot.gif{
InBlock.gif                            tempLob.Write(Buffer,
0,i);
ExpandedSubBlockEnd.gif                        }

InBlock.gif                        fs.Close();
InBlock.gif                        tempLob.EndBatch();
InBlock.gif                        cmd.Parameters.Clear();
ExpandedSubBlockEnd.gif                    }

InBlock.gif                    
// 提交事务
InBlock.gif
                    transaction.Commit();
ExpandedSubBlockEnd.gif                }

InBlock.gif                
catch(Exception ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
throw ex;
ExpandedSubBlockEnd.gif                }

InBlock.gif                
finally
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    conn.Close();
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif        
/// 读取 Oracle Blob 到文件中。
InBlock.gif        
/// </summary>
InBlock.gif        
/// <param name="idData">id 值</param>
InBlock.gif        
/// <param name="fileName">文件名</param>
InBlock.gif        
/// <param name="id">id 键</param>
InBlock.gif        
/// <param name="blob">blob 键</param>
ExpandedSubBlockEnd.gif        
/// <param name="tableName">表名</param>

InBlock.gif        public void ReadBlob(int idData,string fileName, string id, string blob, string tableName)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
string connString = "server=oratest;User ID=kttest;Password=test";
InBlock.gif            
using(conn = new OracleConnection(connString))
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
try
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    conn.Open();
InBlock.gif                    OracleCommand cmd 
= conn.CreateCommand();
InBlock.gif
InBlock.gif                    
// 利用事务处理(必须)
InBlock.gif
                    OracleTransaction transaction = cmd.Connection.BeginTransaction();
InBlock.gif                    cmd.Transaction 
= transaction;
InBlock.gif
InBlock.gif                    
// 获得 OracleLob 指针
InBlock.gif
                    string sql = "select " + blob + " from " + tableName + " where " + id + " = " + idData;
InBlock.gif                    cmd.CommandText 
= sql;
InBlock.gif                    OracleDataReader dr 
= cmd.ExecuteReader();
InBlock.gif                    dr.Read();
InBlock.gif                    OracleLob tempLob 
= dr.GetOracleLob(0);
InBlock.gif                    dr.Close();
InBlock.gif
InBlock.gif                    
// 读取 BLOB 中数据,写入到文件中
InBlock.gif
                    FileStream fs = new FileStream(fileName,FileMode.Create);
InBlock.gif                    
int length = 1048576;
InBlock.gif                    
byte[] Buffer = new byte[length];
InBlock.gif                    
int i;
InBlock.gif                    
while((i = tempLob.Read(Buffer,0,length)) > 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        fs.Write(Buffer,
0,i);
ExpandedSubBlockEnd.gif                    }

InBlock.gif                    fs.Close();
InBlock.gif                    tempLob.Clone();
InBlock.gif                    cmd.Parameters.Clear();
InBlock.gif
InBlock.gif                    
// 提交事务
InBlock.gif
                    transaction.Commit();
ExpandedSubBlockEnd.gif                }

InBlock.gif                
catch(Exception ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
throw ex;
ExpandedSubBlockEnd.gif                }

InBlock.gif                
finally
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    conn.Close();
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif

转载于:https://www.cnblogs.com/zhengmaoch/archive/2005/08/10/212014.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值