转贴一篇:
  随着数据库及多媒体技术的发展,人们需要存储、处理的信息的种类越来越多。数据库中存储的数据不再只是文本、数字,而且还可能是图形、声音、视频等等,各式各样的类型。早期的数据库是无法处理这些类型的数据的。现在的数据库中为处理这些特殊格式的数据,设置了一种大二分对象(BLOB-Binary Large OBject)。
  BLOB在数据库的表中实际上是以二进制数据的形式存放的。由于BLOB的特殊性,一般的程序都无法处理它。比如,如果在一张表中存在BLOB,当用Dattabase Desktop(Delphi在带的数据库管理工具)打开它时,BLOB列将只显示BLOB字样。至于该列中实际存的是什么数据是单靠Database DeskTop是无法得到的。如果在我们编制的程序中,用DBGrid控件打开一个有BLOB字段的表,效果也一样。我们的程序无法直接显示、编辑以及插入BLOB字段。可见,常规的方法是不能满足要求的。
  如何处理BLOB字段,可以借鉴一些可视的桌面数据库的方法。如Access中,BLOB字段是可以通过双击该字段的方式打开。Access是通过OLE的方式实现BLOB数据的编辑及处理的,所以我们也可以在通过程序中设置OLE控件的方法来处理BLOB。下面,我们先讨论操作BLOB的关键问题,然后给出一个简单的例子。

解决方案 »

  1.   

    操作BLOB的关键
    要在程序中自如地操作BLOB数据,无非是解决以下几个问题:
    1. BLOB数据的入库操作
    2. BLOB数据的显示
    3. BLOB数据的编辑、修改
      由于数据的类型可能千变万化,所以,采用OLE方式是较方便的选择。我们可以在程序中放置一个OLE控件,用于显示、编辑各种BLOB数据。那么,问题的关键就是BLOB数据如何入库,以及数据库如何与OLE控件之间传递数据。第一种解决方案是在库中直接保存原始数据。具体方法如下:
      BLOB数据的入库:要把BLOB数据入库,不能向普通的数据那样直接赋值;而是利用BLOB字段的LoadFromfile方法。采用这个方法,可以直接将各种数据的数据文件存入数据库。代码如下:
    AblobField.LoadFromfile(aFileName);
      数据库与OLE控件间的数据传递也要通过数据文件。即,BLOB字段先将数据存盘;然后,OLE从将数据文件中创建所需要的OLE对象。代码如下:
    AblobField.SaveToFile(aFileName);
    AOleContainer.CreateObjectFromFile(aFileName);
    注意:OLE对象不能直接使用LoadFromFile方法,因为,数据库中存放的BLOB对象的格式是文件原来的格式,而不是OLE格式,是不能直接读取的。直接读取将导致运行错误。
      

  2.   

    操作BLOB的关键
    要在程序中自如地操作BLOB数据,无非是解决以下几个问题:
    1. BLOB数据的入库操作
    2. BLOB数据的显示
    3. BLOB数据的编辑、修改
      由于数据的类型可能千变万化,所以,采用OLE方式是较方便的选择。我们可以在程序中放置一个OLE控件,用于显示、编辑各种BLOB数据。那么,问题的关键就是BLOB数据如何入库,以及数据库如何与OLE控件之间传递数据。第一种解决方案是在库中直接保存原始数据。具体方法如下:
      BLOB数据的入库:要把BLOB数据入库,不能向普通的数据那样直接赋值;而是利用BLOB字段的LoadFromfile方法。采用这个方法,可以直接将各种数据的数据文件存入数据库。代码如下:
    AblobField.LoadFromfile(aFileName);
      数据库与OLE控件间的数据传递也要通过数据文件。即,BLOB字段先将数据存盘;然后,OLE从将数据文件中创建所需要的OLE对象。代码如下:
    AblobField.SaveToFile(aFileName);
    AOleContainer.CreateObjectFromFile(aFileName);
    注意:OLE对象不能直接使用LoadFromFile方法,因为,数据库中存放的BLOB对象的格式是文件原来的格式,而不是OLE格式,是不能直接读取的。直接读取将导致运行错误。
      

  3.   

    http://www.csdn.net/expert/topic/707/707317.xml?temp=.6250727
      

  4.   

    //保存
    TBlobField(AdoTable1.FieldByName('data')).LoadFromFile('....');
    TBlobField(AdoTable1.FieldByName('data')).LoadFromStream();//读取
    TBlobField(AdoTable1.FieldByName('data')).SaveToFile('....');
    TBlobField(AdoTable1.FieldByName('data')).SaveToStream();
      

  5.   

    楼上的说的太好了。可是如果是三层结构的呢?中间层用COM+组件,客户端Delphi写的Win32界面。中间层传递给客户端的数据是ADO的Recordset,数据库连接并没有被保持。请指点一二^_^。
      

  6.   

    http://www.csdn.net/expert/topic/707/707317.xml?temp=.1505396
      

  7.   

    可是如果是三层结构的呢?
    中间层用COM+组件,客户端Delphi写的Win32界面。
    中间层传递给客户端的数据是ADO的Recordset,数据库连接并没有被保持。请指点一二^_^。