问题描述:无法将文件大文本以内存流形式存储到BLOB类型的字段中。以下为表结构:
create table TEST2 ( A BLOB, B VARCHAR2(100) )以下为Delphi插入oracle数据库的执行代码:
procedure TForm1.btn6Click(Sender: TObject);
var BlobTemp: TMemoryStream;
begin
  BlobTemp := TMemoryStream.Create;
  BlobTemp.Position:=0;
  //redt1为TRichEdit类型的组件
  redt1.Lines.SaveToStream(BlobTemp);  //cmd1为TADOCommand类型组件
  with cmd1 do
  begin
    CommandText:='insert into test2 values(:a,:b)';
    Parameters.ParamByName('a').LoadFromStream(BlobTemp, ftBlob);
    Parameters.ParamByName('b').Value:='123';
    Execute;
  end;
end;执行以上过程,当redt1.Lines中的内容很少(少于3237个字符)时可以成功插入数据库中,但是当redt1.Lines中的内容大于3237是就会出现以下错误:
ORA-03113: end-of-file on communication channel.
如果将A字段的BLOB类型更改为LONG RAW类型却没有能成功插入大文本,为什么会出现ORA-03113的错误呢?如何在继续保持字段类型为BLOB的情况下实现这个功能呢?

解决方案 »

  1.   

    delphi例子参考一下吧。手头没有oracle没办法测试。procedure TForm1.Button1Click(Sender: TObject);var
      Stream1: TBlobStream;
      Stream2: TStream;
    begin
      Stream1 := TBlobStream.Create(Table1Notes, bmRead);
      try
        ClientDataSet1.Edit;
        { here抯 a different way to create a blob stream } 
        Stream2 := ClientDataSet1.CreateBlobStream(ClientDataSet1.FieldByName('Res'), bmReadWrite);
        try
          Stream2.CopyFrom(Stream1, Stream1.Size);
          ClientDataSet1.Post;
        finally
          Stream2.Free;
        end;  finally
        Stream1.Free;
      end;
    end;
      

  2.   

    1.与数据引擎有关,我以前回过类似的多贴
    1).用bde要改参数。 
    2).用ADO要升级
    3).用ADO要用"Oracle Provider for OLE DB"不要用"Microsoft OLE DB Provider for Oracle"
    2.如果两个BLOB字段以上(其实一个字段也可用):
    http://topic.csdn.net/t/20061107/16/5140028.html
    (JAVA的,适用于delphi)
    关键:
    insert   into   test   values(empty_blob(),empty_blob())   returning   a1,a2   into   :a1,:a2   
      

  3.   

    是把驱动升级了还是换为oracle的?