我写的是测试delphi 存取 oracle blob字段 的代码 ,就几句:
adoquery1.sql.clear;
adoquery1.sql.lines.add('select myblob from mytable');
adoquery1.open;
//到这就出错了
//oracle 提示:ORA-00932: 数据类型不一致;
//delphi 提示:数据类型不被支持;
//请问在delphi 中如何存取blob字段?
//(如果是sql server 不会出现错误 )
注:代码总共就这几句(如果是Table 设置 tablename 是就出错)

解决方案 »

  1.   

    看看我找来的一篇文章:
      随着数据库及多媒体技术的发展,人们需要存储、处理的信息的种类越来越多。数据库中存储的数据不再只是文本、数字,而且还可能是图形、声音、视频等等,各式各样的类型。早期的数据库是无法处理这些类型的数据的。现在的数据库中为处理这些特殊格式的数据,设置了一种大二分对象(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的关键问题,然后给出一个简单的例子。操作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格式,是不能直接读取的。直接读取将导致运行错误。   第二种方案是在库中以OLE格式保存数据。具体方法如下:
      本方案的不同之处,在于数据入库前先进行格式的转换。格式的转换是通过OLE控件完成的。即,先创建OLE对象,然后入库。示例代码如下:
    AOleContainer.CreateObjectFromFile(aFileName);
    AoleContainer.SaveToFile(tmpFileName);
    AblobField.LoadFromfile(tmpFileName);
      这样作的好处是,由于库中直接存储的是OLE格式,所以,在库与OLE控件之间的数据传递将非常方便。在这种情况下,可以通过文件直接传递:数据字段先将数据存到一个临时文件中,然后,OLE控件从临时文件中读取。即:
    AblobField.SaveToFile(aFileName);
    AOleContainer.LoadFromFile(aFileName);
    另外,还可以通过内存流来完成。使用内存流,可减少磁盘操作,大大提高运行效率。即:
    AblobField.SaveToStream(aStream);
    AOleContainer.LoadFromStream(aStream);
    下面是一个简单的例子。一个简单的例子
      本例中,采用Paradox数据库。库中有两个字段,一个是字符型,另一个是BLOB型。我们在主Form上放一个OLE控件用于编辑及转换数据。一个Table控件操作数据库。源代码如下:
    unit blob01;
    interface
    uses
     Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
     StdCtrls, Grids, DBGrids, Db, DBCtrls, OleCtnrs, DBTables, ExtCtrls;
    type
     TForm1 = class(TForm)
      Panel1: TPanel;
      Panel2: TPanel;
      Splitter1: TSplitter;
      Panel3: TPanel;
      Table1: TTable;
      OleContainer1: TOleContainer;
      DBNavigator1: TDBNavigator;
      DataSource1: TDataSource;
      DBGrid1: TDBGrid;
      OpenBtn: TButton;
      CloseBtn: TButton;
      OpenDialog1: TOpenDialog;
      LoadBtn: TButton;
      Table1Filename: TStringField;
      Table1ABlob: TBlobField;
      procedure OpenBtnClick(Sender: TObject);
      procedure CloseBtnClick(Sender: TObject);
      procedure LoadBtnClick(Sender: TObject);
      procedure Table1AfterScroll(DataSet: TDataSet);
    private
     { Private declarations }
    public
     { Public declarations }
    end; 
    var
     Form1: TForm1;implementation{$R *.DFM}procedure TForm1.OpenBtnClick(Sender: TObject);
    begin
      Table1.Open; //打开数据库
    end;procedure TForm1.CloseBtnClick(Sender: TObject);
    begin
      Table1.Close; //关闭数据库
    end;//打开一个数据文件、创建OLE对象、将对象数据存入数据库
    procedure TForm1.LoadBtnClick(Sender: TObject);
    var
    fn: string;
    begin
     if OpenDialog1.Execute then begin //打开文件
      fn := ExtractFileName(OpenDialog1.FileName);
      Table1FileName.AsString := fn;
      OleContainer1.CreateObjectFromFile(OpenDialog1.FileName, False); //创建OLE对象
      OleContainer1.SaveToFile("tmp"); //将OLE数据存入临时文件
      Table1ABlob.LoadFromFile("tmp"); //将OLE数据存入数据库
     end;
    end;//定义此方法用于显示当前记录中的OLE对象
    procedure TForm1.Table1AfterScroll(DataSet: TDataSet);
    begin
     if not Table1ABlob.IsNull then begin
      Table1ABlob.SaveToFile("tmp"); //数据存入临时文件
      OleContainer1.LoadFromFile("tmp"); //从临时文件中读取OLE对象
     end;
    end;end.
    该程序在Delphi 5.0下编译通过。 BLOB就是这样啦
      

  2.   

    softwing(向前看) (  ) 是高手﹐提問人還不加分等什么啊? ^_^
      

  3.   

    谢谢.但不要再谈 oracle 以外的 blob 字段类型好吗,oracle's blob 类型 和其他的 数据库 blob 有差别.在 delphi 中  Paradox, base, access ,sql server interbase 我都试过 ,是好使,但在 存取 oracle's blob  时 出错......我想 delphi 处理 oracle 的 blob 字段 .......  哎...
      

  4.   

    用oracle的provider
    微软的provider不支持blob
      

  5.   

    谢过 nebulaly(竹风论坛) :
     我在 BDE 中设置一个 a 的数据库别名 type= oracle odbc driver 
    但在delphi 中 提示 无效列名 (好像也不支持 oracle's blob 字段)
      

  6.   

    连Sqlserver都没有问题,我真是同情你呀
    var 
      StampStream : TMemoryStrem; 
    begin 
      StampStream := TMemoryStream.Create; 
      try 
        ADOQuery1.Close; 
        ADOQuery1.SQL.CLear; 
        ADOQuery1.SQL.Add('Select BlobField from Table'); 
        ADOQuery1.Open; 
        ADOQuery1.First; 
        StampStream.Clear; 
        TBlobField(ADOQuery1.FieldByName('BlobField')).SaveToStream(StampStream); 
        // ... do whatever with your stream 
      finally 
        StampStream .Free; 
      end; 
    end; 
      

  7.   

    我看到的
    http://community.borland.com/article/0,1410,27166,00.htmlAssigning an Oracle BLOB greater than 32K must be done using AsMemo 
    - by Borland Developer Support Staff
    Abstract: Assigning a blob using VALUE or AsString will result in an AV in SQLORA32.DLL
    If you create a table as such: create table foo
    (f1 int not null,
    f2 long) 
    then insert data such as: insert into foo values (:1, :2) when assigning values to the second parameter you must the AsMemo property. Failing to do this may result in an Access Violation in SQLORA32.DLL at 4D629F73. Example: var
    s : string;
    counter : integer;
    begin
    s := '';
    for counter := 1 to 32768 do
    s := s + 'A';
    with Query1 do
    begin
    Params[0].Value := 1;
    //Params[1].Value := s; //This will cause an AV when ExecSQL is executed.
    //Params[1].AsString := s; //This will cause an AV when ExecSQL is executed.
    //Params[1].AsBlob := s; //Generates Oracle Error
    Params[1].AsMemo := s;
    ExecSQL;
    end;
      

  8.   

    到http://www.google.com/搜索所有网站肯定有你要的,搜索:
    oracle blob delphi
      

  9.   

    到http://www.google.com/搜索所有网站,肯定有你要的,搜索:
    oracle blob  delphi
      

  10.   

    共同进步! 解决疑难。真正..真正..  , 真正用过oracle和delphi组合编程的高手请进(关于lob字段的存取)