odp.net 读写oracle blob字段

DEVELOPER: ODP.NET Serving Winning LOBs:

http://www.oracle.com/technetwork/issue-archive/2005/05-nov/o65odpnet-085139.html

Data Provider for .NET Developer's Guide:

https://docs.oracle.com/database/121/ODPNT/OracleBlobClass.htm#ODPNT4035

从blob字段读取一个图片文件的代码:

 1        OracleConnection con = new OracleConnection(connStr);
 2         con.Open();
 3 
 4         // statement to get a blob
 5         string sql = "select yz from sysusers where yhdh='123'";
 6 
 7         // create command object
 8         // InitialLOBFetchSize
 9         //  defaults to 0
10         OracleCommand cmd = new OracleCommand(sql, con);
11 
12         // create a datareader
13         using (OracleDataReader dr = cmd.ExecuteReader())
14         {
15             // read the single row result
16             dr.Read();
17             // use typed accessor to retrieve the blob
18             OracleBlob blob = dr.GetOracleBlob(0);
19 
20             // create a memory stream from the blob
21             using (MemoryStream ms = new MemoryStream(blob.Value))
22             {
23                 // set the image property equal to a bitmap
24                 // created from the memory stream
25                 pictureBox1.Image = new Bitmap(ms);
26             }
27         }

保存文件到blob字段的代码:

 1         con.Open();
 2 
 3         // 利用事务处理(必须)
 4         OracleTransaction transaction = con.BeginTransaction();
 5         string sql="select yz from sysusers where yhdh='123' FOR UPDATE";
 6         OracleCommand cmd = new OracleCommand(sql, con);
 7         
 8         using ( OracleDataReader reader = cmd.ExecuteReader())
 9         {
10             //Obtain the first row of data.
11             reader.Read();
12             //Obtain a LOB.
13             OracleBlob blob = reader.GetOracleBlob(0);
14             blob.Erase();
15             // 将文件写入 BLOB 中
16             byte[] Buffer;
17             FileStream fs = new FileStream(@"d:\01.jpg", FileMode.Open);
18             using (MemoryStream ms = new MemoryStream())
19             {
20                 int b;
21                 while ((b = fs.ReadByte()) != -1)
22                 {
23                     ms.WriteByte((byte)b);
24                 }
25                 Buffer = ms.ToArray();
26             }
27 
28             // Begin ChunkWrite to improve performance
29             // Index updates occur only once after EndChunkWrite
30             blob.Position=0;
31             blob.BeginChunkWrite();  //启用BeginChunkWrite不是必须,只与性能有关
32             blob.Write(Buffer, 0,Buffer .Length);  //从字节数据写入blob字段
33             blob.EndChunkWrite();
34             blob.Close();
35         }
36         // 提交事务
37         transaction.Commit();
38         con.Close();

 

posted @ 2015-02-20 09:21  sekon  阅读(486)  评论(0编辑  收藏  举报