要做一个新闻网站,它的新闻内容和图片都是以Blob(二进制流)存放在Oracle中的,现在需要读取和写入,把它们还原为文本或图片类型,使用File对象吗,哪里有例子可以下载吗?或者请那位大虾指点一下。

解决方案 »

  1.   

    See:HOW TO: Read and Write BLOB Data by Using ADO.NET
    http://support.microsoft.com/default.aspx?scid=kb;EN-US;309158
    http://support.microsoft.com/default.aspx?scid=kb;EN-US;308042
      

  2.   

    To: lihonggen0谢谢你的推荐,让我收益不少!不过我的问题还是没有解决。因为数据库里存的是.doc文件(Word文档),还原为.doc文件之后我不知道怎么把它显示到网页上,有没有一种方法可以提取到.doc的文本,然后用一个控件显示到网叶上呢(比方说用Label控件),或者能不能用什么方法把.doc的文本直接转换为网叶呢,还请lihonggen0指点,也请哪为大虾指点!
      

  3.   

    从数据库中获取 BLOB 值
     * //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    DataReader 的默认行为是在整个数据行可用时立即以行的形式加载传入数据。但是,对于二进制大对象 (BLOB) 则需要进行不同的处理,因为它们可能包含数十亿字节的数据, 而单个行中无法包含如此多的数据。Command.ExecuteReader 方法具有一个重载,它将
    采用 CommandBehavior 参数来修改 DataReader 的默认行为。您可以将 CommandBehavior.SequentialAccess 传递到 ExecuteReader 方法来修改 DataReader 的默认行为,以便让 DataReader 按照顺序在接收到数据时立即将其加载,而不是加载数据行。这是加载 BLOB 或其他大数据结构的理想方案。请注意,该行为可能会因数据源的不同而不同。例如,从 Microsoft Access 中返回 BLOB 将导致整个 BLOB 加载到内存中,而不是按接收数据的顺序加载数据。
    在将 DataReader 设置为使用 SequentialAccess 时,务必要注意访问所返回字段的顺序。DataReader 的默认行为是在整个行可用时立即加载该行,这使您能够在读取下一行之前按任何顺序访问所返回的字段。但是,当使用SequentialAccess 时,必须按顺序访问由 DataReader 返回的不同字段。例如,如果查询返回三个列,其中第三列是 BLOB,则必须在访问第三个字段中的 BLOB 数据之前返回第一个和第二个字段的值。如果在访问第一个或第二个字段之前访问第三个字段,则第一个和第二个字段值将不再可用。这是因为
    SequentialAccess 已修改 DataReader,使其按顺序返回数据,当 DataReader 已经读取超过特定数据时,该数据将不可用。
    在访问 BLOB 字段中的数据时,请使用 DataReader 的 GetBytes 或 GetChars 类型化访问器,它们将用数据来填充数组。还可以对字符数据使用 GetString,但是为了节省系统资源,您可能不希望将整个 BLOB 值加载到单个字符串变量中。您可以指定要返回的特定数据缓冲区大小,以及从返回的数据中读取的第一个字节或字符的起始位置。GetBytes 和 GetChars 将返回一个 long 值,它表示返回的字节或字符数。如果将一个空数组传递给
    GetBytes 或 GetChars,则返回的长值将是 BLOB 中字符或字符的总数。您可以选择将数组中的某个索引指定为所读取数据的起始位置。
    以下示例从 Microsoft SQL Server 中的 pubs 示例数据库中返回发行者 ID 和徽标。发行者 ID (pub_id) 是字符字段,而徽标则是图形,即 BLOB。由于 logo 字段是位图,因此该示例使用 GetBytes 返回二进制数据。
    请注意,由于必须按顺序访问字段,所以将在访问徽标之前访问当前数据行的发行者 ID。
      

  4.   

    从数据库中获取 BLOB 值
     * //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    DataReader 的默认行为是在整个数据行可用时立即以行的形式加载传入数据。但是,对于二进制大对象 (BLOB) 则需要进行不同的处理,因为它们可能包含数十亿字节的数据, 而单个行中无法包含如此多的数据。Command.ExecuteReader 方法具有一个重载,它将
    采用 CommandBehavior 参数来修改 DataReader 的默认行为。您可以将 CommandBehavior.SequentialAccess 传递到 ExecuteReader 方法来修改 DataReader 的默认行为,以便让 DataReader 按照顺序在接收到数据时立即将其加载,而不是加载数据行。这是加载 BLOB 或其他大数据结构的理想方案。请注意,该行为可能会因数据源的不同而不同。例如,从 Microsoft Access 中返回 BLOB 将导致整个 BLOB 加载到内存中,而不是按接收数据的顺序加载数据。
    在将 DataReader 设置为使用 SequentialAccess 时,务必要注意访问所返回字段的顺序。DataReader 的默认行为是在整个行可用时立即加载该行,这使您能够在读取下一行之前按任何顺序访问所返回的字段。但是,当使用SequentialAccess 时,必须按顺序访问由 DataReader 返回的不同字段。例如,如果查询返回三个列,其中第三列是 BLOB,则必须在访问第三个字段中的 BLOB 数据之前返回第一个和第二个字段的值。如果在访问第一个或第二个字段之前访问第三个字段,则第一个和第二个字段值将不再可用。这是因为
    SequentialAccess 已修改 DataReader,使其按顺序返回数据,当 DataReader 已经读取超过特定数据时,该数据将不可用。
    在访问 BLOB 字段中的数据时,请使用 DataReader 的 GetBytes 或 GetChars 类型化访问器,它们将用数据来填充数组。还可以对字符数据使用 GetString,但是为了节省系统资源,您可能不希望将整个 BLOB 值加载到单个字符串变量中。您可以指定要返回的特定数据缓冲区大小,以及从返回的数据中读取的第一个字节或字符的起始位置。GetBytes 和 GetChars 将返回一个 long 值,它表示返回的字节或字符数。如果将一个空数组传递给
    GetBytes 或 GetChars,则返回的长值将是 BLOB 中字符或字符的总数。您可以选择将数组中的某个索引指定为所读取数据的起始位置。
    以下示例从 Microsoft SQL Server 中的 pubs 示例数据库中返回发行者 ID 和徽标。发行者 ID (pub_id) 是字符字段,而徽标则是图形,即 BLOB。由于 logo 字段是位图,因此该示例使用 GetBytes 返回二进制数据。
    请注意,由于必须按顺序访问字段,所以将在访问徽标之前访问当前数据行的发行者 ID。
      

  5.   

    不好意思,上面多发了一次将 BLOB 值写入数据库
    //#####################################################################
    可以将二进制大对象 (BLOB) 作为二进制或字符数据写入数据库,具体视数据源的字段类型而定。若要将 BLOB 
    值写入数据库,请发出相应的 INSERT 或 UPDATE 语句并将 BLOB 值作为输入参数传递(请参见将存储过程用于命令)。
    如果 BLOB 存储为文本格式(如 SQL Server text 字段),则可将 BLOB 作为字符串参数传递。如果 BLOB 存储为
    二进制格式(如 SQL Server image 字段),则可将类型 byte 的数组作为二进制参数传递。            注意   BLOB 可能会相当大,因此作为单个值写入时可能会占用大量的系统内存,从而导致应用程序性能下降。
    若要减少写入 BLOB 值时所使用的内存量,可以按“块”将 BLOB 写入数据库。用该方法将 BLOB 写入数据库的
    过程具体取决于数据源的功能。有关按“块”将 BLOB 值写入 SQL Server 的示例,请参见将 BLOB 值写入 
    SQL Server 时保留资源。
                以下代码示例将员工信息添加到 Northwind 数据库中的 Employees 列表中。员工照片将从文件中读取并添加到
    表中的 Photo 字段,该字段为 image 字段。
      

  6.   

    To:91bct(路人)    没有示例代码啊,你发漏了吧。