看不出错来。不过,你为什么不直接用TBlobField.LoadFromFile方法而要增加一道手续?另外,我对'lady3_3.zip'感兴趣,能不能给我发一个?[email protected] 谢了。

解决方案 »

  1.   

    之所以多一道手续,是因为以前发现文档少了一个字节,以为是在转换中,少掉的字节被用做文件结束标志了.所以用stream,可以在保存到数据库时加一个字节,后来还是有问题,所以用fc仔细比较了一下,发现居然是中间就发生了错位.
    lady3_3.zip是朱德庸的<涩女郎>漫画,在http://comicz.yeah.net/有下载,发邮件的话,文件就太大了(3m到5m)呢.
      

  2.   

    TMemoryStream用得不合适,改成文件流TFileStream
      

  3.   

    测试之后,错误依旧,而我现在怀疑是BDE设置里面关于Blob的块的大小和缓冲的块数的设置问题.所以要是手工用一个Buffer分批放到数据库可能可以解决问题,谁能给点提示代码.
    另外,我用java测试放20m的文件都没有问题,应该错误不在oracle.(使用了buffer)
      

  4.   

    Delphi安装后BDE 的可用内存是2M,把它加大,修改BDE Adminstrator ->
    Configuration ->system->init->sharedmemsize 为20480,20M!
       建议使用ADO,BDE落伍了!
      

  5.   

    参考下面代码,现在是什么类型文件都可以
    //存文件到数据库
    procedure TForm1.Button1Click(Sender: TObject);
    begin
        if OpenPictureDialog1.Execute then
        begin    with Query1 do
        begin
            sql.clear;
            sql.add('INSERT INTO TBIMAGE(id,filename,image) VALUES(1,:filename,:IMAGE)');
            params[0].AsString := OpenPictureDialog1.FileName;
            params[1].LoadFromFile(OpenPictureDialog1.FileName,ftGraphic);
            execsql;
    end;
    end;end;
    //取到本地
    var
        t:TBlobField;
    begin
        with Query1 do
        begin
            sql.Clear;
            sql.Add('select id,filename,image from tbimage');
            open;        while not eof do
            begin
                SavePictureDialog1.InitialDir := ExtractFilePath(FieldByName('filename').AsString);
                if SavePictureDialog1.Execute then
                begin
                    t := FieldByName('IMAGE') As TBlobField;
                    t.SaveToFile(SavePictureDialog1.FileName);
                end;
                next;
            end;
        end;
    end;
      

  6.   

    我测试了一下你的程序,你的程序应该不是针对Oracle的吧,如果用你的程序,Oracle会报错"只能在Long中插入改值",
    如果将BlobType修改为ftOraBlob,则错误提示是"插入的值过大",Oracle手册说过,在插入Blob域值之前,要用Empty_Blob初始化,这也就是我的私有函数的作用.
    用你的概念,我现在修改了一下插入的程序,但是取出来还是出错:
    var
      KeyVal, FileName  : string;
      i                 : integer;
      MS                : TFileStream;
      Bf                : TBlobField;
    begin
      FileName := 'D:\Leetest\BlobTest\lady3_3.zip';
      Ms := TFileStream.Create(FileName, fmOpenRead);
      db.StartTransaction;
      for i := 1 to 10 do
        with Table1 do
        try
          Randomize;
          insert;
          KeyVal := inttostr(random(100000));
          FieldbyName('keyfield').AsString := KeyVal;
          post;
          IniOracleBlobField(KeyVal);
          edit;
    //      Ms.SetSize(ms.Size + 1);
          Bf := TBlobField(FieldbyName('blob_file'));
          Bf.BlobType := ftOraBlob;
          Bf.LoadFromStream(ms);
          post;
        except
          db.rollback;
          Ms.Free;
          abort;
        end;
      Ms.Free;
      db.Commit;
    end;
      

  7.   

    修改bde的设置的确可以解决问题,实际上,以前的一个项目就是这样解决的,但是副作用也很明显:
    你不能估计用户的Blob域的大小,客户端查询速度有影响.