zoukankan      html  css  js  c++  java
  • 通过OracleDataReader来读取BLOB类型的数据 (转载)

     通过OracleDataReader来读取BLOB类型的数据 

        在实际的应用过程中,需要把大块的二进制数据存储在数据库中。读取这些大块的数据,可以通过强制类型转换成为byte数组,但是当这个二进制数据体够大时(几十兆或者上百兆),一次并不能获取到他的完整长度,所以需要分块获取。
        下面提供两种方法,供大家参考。
        1、直接将BLOB数据转换成为byte数组
       

              long blobDataSize = 0//BLOB数据体实际大小
                    long readStartByte = 0;//从BLOB数据体的何处开始读取数据
                    int bufferStartByte = 0;//将数据从buffer数组的何处开始写入
                    int hopeReadSize = 1024//希望每次从BLOB数据体中读取数据的大小
                    long realReadSize = 0;//每次实际从BLOB数据体中读取数据的大小
                    
    //CommandBehavior.SequentialAccess将使OracleDataReader以流的方式加载BLOB数据
                    OracleDataReader dr = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
                    
    byte[] buffer = null;
                    
    while (dr.Read())
                    
    {
                        blobDataSize 
    = dr.GetBytes(00null00); //获取这个BLOB数据体的总大小
                        buffer = new byte[blobDataSize];
                        realReadSize 
    = dr.GetBytes(0, readStartByte, buffer, bufferStartByte, hopeReadSize);
                        
    //循环,每次读取1024byte大小
                        while ((int)realReadSize == hopeReadSize)
                        
    {
                            bufferStartByte 
    += hopeReadSize;
                            readStartByte 
    += realReadSize;
                            realReadSize
    = dr.GetBytes(0, readStartByte, buffer, bufferStartByte, hopeReadSize);
                        }

                        
    //读取BLOB数据体最后剩余的小于1024byte大小的数据
                        dr.GetBytes(0, readStartByte, buffer, bufferStartByte, (int)realReadSize);
                        
    //读取完成后,BLOB数据体的二进制数据就转换到这个byte数组buffer上去了
                    }

       
        2、将BLOB数据直接写到文件中去
       

             
                    
    long readStartByte = 0;//从BLOB数据体的何处开始读取数据
                    int hopeReadSize = 1024//希望每次从BLOB数据体中读取数据的大小
                    long realReadSize = 0;//每次实际从BLOB数据体中读取数据的大小
                    
    //CommandBehavior.SequentialAccess将使OracleDataReader以流的方式加载BLOB数据
                    OracleDataReader dr = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
                    
    while (dr.Read())
                    {
                        FileStream fs 
    = new FileStream(filename, FileMode.Create);
                        
    byte[] buffer = new byte[hopeReadSize];
                        realReadSize 
    = dr.GetBytes(0, readStartByte, buffer, 0, hopeReadSize);
                        
    //循环,每次读取1024byte大小,并将这些字节写入流中
                        while ((int)realReadSize == hopeReadSize)
                        {
                            fs.Write(buffer, 
    0, hopeReadSize);
                            readStartByte 
    += realReadSize;
                            realReadSize
    = dr.GetBytes(0, readStartByte, buffer, 0, hopeReadSize);
                        }
                        
    //读取BLOB数据体最后剩余的小于1024byte大小的数据,并将这些字节写入流中
                        realReadSize= dr.GetBytes(0, readStartByte, buffer, 0, hopeReadSize);
                        fs.Write(buffer, 
    0, (int)realReadSize);
                    }

    转载自:http://blog.csdn.net/lonet/archive/2010/03/03/5342386.aspx

  • 相关阅读:
    Windows 创建 Redis 和 zookeeper 系统服务
    mysql 5.7 非正常安装,无法启动 服务没有报告任何错误
    将整个 project 资源打包
    使用Nexus3搭建Maven私服+上传第三方jar包到本地maven仓库
    所有子模块都要执行的checkstyle检查
    把项目通过maven生产源码包和文档包并发布到自己的私服上
    C#.NET常见问题(FAQ)-在VS程序如何取消.vshost的进程
    C#.NET常见问题(FAQ)-无法直接启动带有类库输出类型的项目怎么办
    C#.NET常见问题(FAQ)-VS如何整个项目中查找字符串
    C#.NET常见问题(FAQ)-如何在系统变量中加入新的环境变量
  • 原文地址:https://www.cnblogs.com/wuhenke/p/1860752.html
Copyright © 2011-2022 走看看