if you are using ODP.NET data provider from Oracle, seeManipulate Advertisements Sample - DML Operations for LOB Columns Through ODP.NET Using C#
http://otn.oracle.com/sample_code/tech/windows/odpnet/DSDRwithLOB/Readme.htmlotherwise, see Q316887 HOW TO: Read/Write File to/from BLOB Column w/ADO.NET & VB .NET
   http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q316887This does true chunking using SQL Server-specific commands:
   Q317034 HOW TO: Read/Write File to/from BLOB Column in ADO.NET & VB .NET
   http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q317034This uses a DataSet:
   Q308042 HOW TO: Read and Write BLOB Data by Using ADO.NET with VB .NET
   http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q308042Various others:   Q326502 HOW TO: Read and Write BLOB Data by Using ADO.NET Through ASP.NE
   http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q326502   Q322796 HOW TO: Pass a BLOB as a Parameter to an Oracle Package
   http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q322796   Q317670 HOW TO: Copy Picture from Database Directly to PictureBox in VB
   http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q317670

解决方案 »

  1.   

    下面是我项目中的情况,使用asp.net读取oracle中的blob类型字段。还有图形的,不方便。可以联系我: [email protected]
    ========================
    '本程序中相关Oracle的BLOB类型字段的读取
    Imports System
    Imports System.Configuration
    Imports System.Io
    Imports System.Text
    Imports System.Web.UI
    Imports System.Web.UI.WebControls
    Imports System.Data
    Imports System.Data.OleDbPublic Class rule_doc
    Inherits System.Web.UI.Page'=======================================
    protected unit_name as label


    Dim SQLSerch As String '查询字串
    Dim Conn As String '连接字串

    Dim SBGLConn AS OleDbConnection '创建连接对象
    Dim SBGLComm As OleDbCommand '定义command对象
    Dim SBGLRD As OleDbDataReader '定义oledbdatareader对象


    Dim SBGLAd AS OledbDataAdapter '定义数据收集对象
    Dim SBGLDs AS New DataSet '定义数据集对象
    Dim SBGLDv AS New DataView '以下是对 BLOB 字段的处理过程

    Dim File_Blob as FileStream '定义filestream类型的对象,blob数据类型视为字符流文件
    Dim Bit_Blob as BinaryWriter '定义binarywrite类型的对象,用于存储读入的BLOB字符流,写成二进制形式的字符流

    Dim BufferSize as integer = 100 '定义每次读取blob数据时的缓冲大小,取整数100字节
    Dim Out_Byte (99) as Byte 'BLOB byte()被GetBytes方法填充的字节,BufferSize - 1 是该BYTE数据类型的上限 Dim Retval As Long ' 接受来自 GetBytes 方法的字符
    Dim StartIndex As Long = 0 ' 定义 BLOB 输出的起点位置
    Dim rule_id As String = "" ' 定义数据库当中的唯一标识,和数据库当中的rule_no对应

    '=======================================
    Sub Page_Load(Sender AS Object, e AS EventArgs)'初始化参数,OracleConn在web.config文件中配置,用于指定数据库连接字符串
    'sqlstr字符串是 select * from TUHA.T_RULES order by rule_class ,要处理的BLOB字段是 RULE_CONTENT Conn = configurationsettings.appsettings("OracleConn")
    SBGLConn = New OleDbConnection(Conn)
    SBGLConn.Open() '打开链接

    SQLSerch = "Select rule_no,rule_content from TUHA.T_RULES Order By Rule_Class"

    SBGLComm = New OleDbCommand(SQLSerch,SBGLConn) '使用oledbcommand打开数据库,执行sql语句
    SBGLRD = SBGLComm.ExecuteReader(CommandBehavior.SequentialAccess) '将sql执行结果写入SBGLRD对象中 Do While SBGLRD.Read()

    rule_id = SBGLRD.GetString(0) '得到当前记录行的唯一标识,即取得rule_no字段的值

    '创建一个文件,用于存放读出的内容,注意扩展名的用法
    '构造函数FileStream(string,filemode,fileaccess),其中string="rule_no" & rule_id & ".doc"(文件名称),
    'filemode= FileMode.OpenOrCreate(打开或创建文件方法),fileaccess= FileAccess.Write(文件访问的方法)
    '生成文件
    Dim path as String
    Dim filename as String
    'filename = "rule_no" & rule_id & ".doc"
    'path = server.mappath(filename)
    File_Blob = New FileStream(server.mappath("files\") & "rule_no" & rule_id & ".doc", FileMode.OpenOrCreate, FileAccess.Write)
    Bit_Blob = New BinaryWriter(File_Blob)

    '重新设置,准备下一次的重新读取blob内容
    StartIndex = 0

    ' Read bytes into outbyte() and retain the number of bytes returned.
    'response.write(startindex.tostring + ", " + out_byte.tostring + ", " + buffersize.tostring)
    Retval = SBGLRD.GetBytes(1, StartIndex, Out_Byte, 0, BufferSize)

    ' Continue reading and writing while there are bytes beyond the size of the buffer.
    Do While Retval = BufferSize
    Bit_Blob.Write(Out_Byte)
    Bit_Blob.Flush()

    ' Reposition the start index to the end of the last buffer and fill the buffer.
    StartIndex = StartIndex + BufferSize
    Retval = SBGLRD.GetBytes(1, StartIndex, Out_Byte, 0, BufferSize)
    Loop

    ' 写到缓存中
    Bit_Blob.Write(Out_Byte)
    Bit_Blob.Flush()

    ' Close输出文件.
    Bit_Blob.Close()
    File_Blob.Close()
    Loop SBGLRD.Close()
    SBGLConn.Close()
    End Sub
    '=======================================
    End Class
      

  2.   

    上面是一次性把blob中的所有图片都读出来,这样能节省效率。因为时间紧,对于“每一次调用图片或word文档,都要读取一次数据库”的方法,暂时没有时间研究,希望讨论。
      

  3.   

    另外,vs.net当中的动态帮助,有一个sqlserver的例子,完全可以照搬,不过oledbdataconnection等等的对象要相应的更改。
    请打开vs.net的动态帮助“搜索”功能页框,输入:blob,搜索出的结果就有:
    从数据库中读取blob数据类型的字段。
      

  4.   

    上面讲的很多要不是sql server 要不是用oracle的ODP.NET data provider,我下面的程序运行时出现错误,麻烦帮我看一下,谢谢!string strconnect = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"];
    OleDbConnection myConntion = new OleDbConnection(strconnect);
    myConntion.Open();
    string sqlstr = "Select image From photo where xzbh = '"+ this.TextBox1.Text.Trim() +"'";
    OleDbCommand cmd = new OleDbCommand(sqlstr,myConntion);
    OleDbDataReader myReader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);if(myReader.Read())  
    {
                      FileStream fs = new FileStream("c:\\1.jpg",FileMode.OpenOrCreate,FileAccess.Write);
             BinaryWriter bw = new BinaryWriter(fs);
    this.Image1.ImageUrl = @"c:\1.jpg";
      

  5.   

    上面代码中,
    OleDbDataReader myReader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
    运行后报错说oracle不支持此接口,发生oracle错误,无法从oracle中检索信息,类型不支持
      

  6.   

    oracle安装到你的服务器上了,这样,oledb提供了两种连接oracle的方式:
    一种是microsoft提供的oracle连接ado.net的方式,
    另一种是oracle提供的链接ado.net方式
    请使用oracle提供的方式,我的连接oracle的ado.net方式如下(再web.config里)
    <add key="OracleConn" value="Provider=OraOLEDB.Oracle.1;Password=tuha;Persist Security Info=True;User ID=tuha;Data Source=thequip" />
    其中的provider=oraoledb.oracle.1——这就是oracle提供的连接ado.net的方式。
      

  7.   

    我的代码,使用oracleclient,如果是oledb,要做相应修改
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Diagnostics;
    using System.Web;
    using System.Web.Services;
    using System.Data.OracleClient;
    using System.Configuration;
    using System.IO;namespace WebLeaf.News
    {
    /// <summary>
    /// UpLoadManage 的摘要说明。
    /// </summary>
    public class UpLoadManage
    {

    //Sql字符串
    private string strSql="";
    //声明调用的数据管理类
    //private BaseClass.DbManager dbMgr;
    //数据库连接字符串
    protected static string strConn = ConfigurationSettings.AppSettings["strConnection"];
    protected OracleConnection objConn; public UpLoadManage()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    } /// <summary>
    /// 接受三个参数,文件名,文件解说描述,流对象, 然后把流读入数组,写入数据库。
    /// </summary>
    /// <param name="id">图片编码</param>
    /// <param name="SourceFilePath">图片名</param>
    /// <param name="FileType">图片文件类型</param>
    /// <param name="explain">描述</param>
    /// <param name="b">流对象(转成byte[])</param>
    /// <returns></returns>
    public string FileUp(int id,string SourceFilePath,string FileType,string explain,byte[] b)
    {
    string fileName="";
    string sResult="ok";
    objConn = new OracleConnection(strConn); try
    {
    fileName=System.IO.Path.GetFileName(SourceFilePath);
    int FileLen=Int32.Parse(b.Length.ToString());
    if(FileLen<1)
    {
    return "文件不能为空!";
    }
    else if(FileLen>=10240000)//10M
    {
    return "文件超长,限制大于10M!";
    }

    // Byte[] b=new Byte[FileLen];
    // fs.Read(b,0,b.Length);
    // fs.Close();
    OracleLob objLob;
    objConn.Open();
    OracleTransaction tx=objConn.BeginTransaction();
    OracleCommand cmd=new OracleCommand();
    cmd=new OracleCommand("declare xx blob; begin dbms_lob.createtemporary(xx, false, 0); :tempblob := xx; end;",objConn,tx);
    OracleParameter p1=cmd.Parameters.Add("tempblob", OracleType.Blob);
    p1.Direction=ParameterDirection.Output; cmd.ExecuteNonQuery();

    objLob=((System.Data.OracleClient.OracleLob)(((System.Object)(p1.Value))));
    objLob.BeginBatch(OracleLobOpenMode.ReadWrite);
    objLob.Write(b, 0, b.Length);
    objLob.EndBatch();
    objLob.Position=0; cmd.Parameters.Clear(); strSql = "insert into newspic (picid,ori_type,bindata,description) values ("+id+",'"+FileType+"',:FileData,'"+explain+"')";
    OracleCommand objCmd=new OracleCommand(strSql,objConn);
    objCmd.Transaction=tx;
    objCmd.Parameters.Add(new OracleParameter("FileData",OracleType.Blob)).Value=objLob;

    objCmd.ExecuteNonQuery();
    tx.Commit();

    }
    catch(OracleException ex)
    {
    sResult=ex.Message.ToString();
    }
    finally
    {
    objConn.Close();
    }
    return sResult;
    }
    /// <summary>
    /// 删除序号为id的数据行(文件)
    /// </summary>
    /// <param name="id">文件编码</param>
    /// <returns>成功 ok,失败返回 fail reason.</returns>
    public string FileDelete(int id)
    {
    string sResult="ok";
    objConn = new OracleConnection(strConn);
    try
    {
    OracleCommand objCmd=new OracleCommand("delete from newspic where id="+id,objConn);

    objConn.Open();
    int num=objCmd.ExecuteNonQuery();
    if(num<1)
    {
    sResult="没有给定编号的信息!";
    }
    }
    catch(OracleException ex)
    {
    sResult=ex.Message.ToString();
    }
    finally
    {
    objConn.Close();
    }
    return sResult;
    }
    /// <summary>
    /// 获取一个文件
    /// </summary>
    /// <param name="series">文件序号</param>
    /// <returns></returns>
    public DataSet GetOneFile(int id)
    {
    objConn = new OracleConnection(strConn);
    DataSet ds = new DataSet();
    try
    {
    objConn.Open();
    strSql="select * from newspic where id = "+id;
    OracleDataAdapter objAdapter= new OracleDataAdapter(strSql,objConn);

    objAdapter.Fill(ds, "files"); 
    }
    catch(OracleException ex)
    {
    throw new Exception(ex.Message);
    }
    finally
    {
    objConn.Close();
    }
    return ds;
    } /// <summary>
    /// 获取文件
    /// </summary>
    /// <returns></returns>
    public DataSet GetFiles()
    {
    objConn = new OracleConnection(strConn);
    DataSet ds = new DataSet(); try
    {
    strSql="select * from newspic";
    OracleDataAdapter objAdapter= new OracleDataAdapter(strSql,objConn);
    objAdapter.Fill(ds, "files"); 
    }
    catch(OracleException ex)
    {
    throw new Exception(ex.Message);
    }
    finally
    {
    objConn.Close();
    }
    return ds;
    }
    }
    }