用DMIMAGE控件直接和数据库绑定,用的是ado连接为何保存大于100k的jpg图片是报"Bitmap image is not valit"错误.代码如下:
procedure TForm1.DBImage1DblClick(Sender: TObject);
var
  bmpp:TBitmap;
  jpegp:TJPEGImage;
  mstrm:Tmemorystream;
begin
   if OpenDialog1.Execute then
   begin
      jpegp:=TJPEGImage.Create;      mstrm:=Tmemorystream.Create;
      mstrm.Clear;
      mstrm.Position:=0;
      if pos('JPG',opendialog1.filename)> 0 then
      begin
        jpegp.LoadFromFile(opendialog1.filename);
        bmpp.Assign(jpegp);
        bmpp.SaveToStream(mstrm);
      end
      else
        mstrm.LoadFromFile(opendialog1.FileName);
      Query1.Edit;
      //TBlobField(Query1.FieldByName('照片')).LoadFromFile(OpenDialog1.FileName);
      TBlobField(Query1.FieldByName('照片')).LoadFromStream(mstrm);//运行到此报错
      Query1.Post;
      jpegp.Free;
      bmpp.Free;
      mstrm.Free;
   end;end;

解决方案 »

  1.   

    我用的是sql2000数据库,表中定义image类型,和数据库有关吗?
      

  2.   

    TBlobField(Query1.FieldByName('照片')).LoadFromStream(mstrm);//
    这应该是保存到流吧,怎么还是提取
      

  3.   

    //修改为
    procedure TForm1.DBImage1DblClick(Sender: TObject);
    var
      bmpp:TBitmap;
      jpegp:TJPEGImage;
      mstrm:Tmemorystream;
    begin
       if OpenDialog1.Execute then
       begin
            Query1.Edit;
          if pos('JPG',opendialog1.filename)<=0 then
          begin
             mstrm:=Tmemorystream.Create;
             mstrm.Clear;
             mstrm.Position:=0;
             jpegp:=TJPEGImage.Create;
             bmpp :=TBitmap.Create;
            try
              jpegp.LoadFromFile(opendialog1.filename);
              bmpp.Assign(jpegp);
              bmpp.SaveToStream(mstrm);
              TBlobField(Query1.FieldByName('照片')).LoadFromStream(mstrm); 
            finally
      jpegp.Free;
      bmpp.Free;
      mstrm.Free;
            end; 
          end
          else
            begin 
              TBlobField(Query1.FieldByName('照片')).LoadFromFile(OpenDialog1.FileName); 
            end;  
         try 
           Query1.Post;
         except
           on E:Exception do
             showmessage(E.Message);
         end;    end;end;
      

  4.   

    这个错误我解决了但是又报"Invalid BlOB length"错误,是图片大小的原因吗?不是说用ado没影像吗?
      

  5.   

    是DBImage1控件显示造成的,它不支持大图片的显示,可以下载第三方控件来进行大图片的显示
      

  6.   

    WangZWang(阿来) 说的对,不要用 Delphi 自带的 DBImage ,不好用。
      

  7.   

    Invalid BlOB length,不要用BDE或者将bde设置中的那两个cache设置成16384,默认好像是特别小
      

  8.   

    各位我这一天来试了n种方法,什么修改bolb size值等等都试了,还是不行.
    楼上说是dbimage的问题,但是我跟踪程序发现是在向数据库提交时报的错呀.
    着急呀!!!!
      

  9.   

    我试了一下将dmimage换成image也还是提交不成功报Invalid BlOB length错误
      

  10.   

    Invalid BlOB length,与你用的数据库及引擎有关
    首先建议升级ado至2.7以上
    如果你用sqlserver数据库,最好不要用BDE,用ado试试
    如果你用oracle,一定要升ado,且不能用microsoft ole db provider for oracle,要改用oracle provider for ole db
    另外,建议用google,网上有n多类似问题
      

  11.   

    楼上,我是修改别人写的程序,工期短,本身用的就是BDE和sql2000所以这两方面我都无法改变,怎么办?
      

  12.   

    1.不知你的DELPHI是什么版本,如果是D6,打PACK2补丁
    2.设BDE的blobs to cache为-1
    如果还不能解决问题,只能改ADO了
      

  13.   

    总结:这个问题我弄了好几天,收索了网上各种帖子,发现如下:
    在操作Oracle8I数据库的BLOB字段过程中发现,如果使用Delphi6提供的“BDE”或Windows操作系统提供的“ODBC”作为Oracle数据库的驱动程序,在对BLOB或CLOB类型字段进行读写操作时,能够读写的最大文件尺寸是32KB(这是隐含值),通过Delphi提供的BDE Administrator工具可以对该值进行修改(修改BLOB SIZE参数值),BLOB SIZE参数的取值范围是大于32KB,小于1000KB(1MB)。当读写的文件尺寸大于1MB时,会发生错误,无法将数据写入BLOB字段。如果使用Windows提供的“ADO”作为Oracle数据库驱动程序时,对BLOB字段的操作,没有小于32KB或少于1MB的限制,只要小于BLOB字段类型本身最大尺寸即可(小于4GB)。
    所以,希望这个总结能给遇到我这样同样问题的人,不要再浪费时间了,如果你用的是BDE连接,最大只能存1000kb的图片,不要幻想任意修改blob size的值.切记!!!