我现在需要将多种格式的图像文件(*.bmp,*.Jpg,*.TIFF)直接插入到SQL SERVER的数据库当中,test表的数据库字段是这样的:
id        char 
pic       image我做了一个简单的Query1,主要代码是:
Query1.sql.add('insert into test(id,pic) value(:id,:pic)');
Query1.ParamByname('id').Asstring:='1';
Query1.ParamByname('pic').LoadFromFile('d:\1.bmp',ftBlob);
Query1.ExecSql;这样我的数据的确更新上去了,图片也上去,但有个问题:
我较小的图片,20k以下的基本正常 ,大于20k后就会出问题.
我用的TDBImage来显示,大于20k的图下显示出来上部会出现一片黑色的块,若是上传的JPG就根本显示不出来了。请问各位高手,有没有其它方法来上传和显示呢?我的图片不会超过1M。
是不是需要转换成什么位流方式呢?
我试过Tbitmap和Tgraphic都不怎么行得通,不知Timage可以否?又该如何用呢》?问题解决马上结贴.

解决方案 »

  1.   

    你使使转成memorystream,我存WORD文档的时候转成流,读的时候,也使先存成流,然后再IMAGE.loadfromstream。使使,不行再说!哦棵!
      

  2.   

    修改BDE的ODBC配置中的参数:
    在Delphi 开发环境->Database->explore->你的ODBC->修改BLOB SIZE,BLOBS TO CACHE两个参数.
    祝你好运.
      

  3.   

    参考一下
    http://expert.csdn.net/Expert/topic/1204/1204374.xml?temp=.9548761
      

  4.   

    不行
    还有没有其它高招。
    我现在的问题是写进去的内容读出来时,小的BMP没问题,大的不行。
    这图形应转换成什么流方式来表达呢?
      

  5.   

    你这样试一试stringstream1 := TStringStream.create(nil);
    img.savetostream(stringstream1);
    Query1.sql.add('insert into test(id,pic) value(:id,:pic)');
    Query1.ParamByname('id').Asstring:='1';
    query1.paramByName('pic').asblob := stringstream1.datastring;
    query1.executesql;
    stringstream1.free; 
    img是一个支持显示图像的image控件
      

  6.   

    给你一个Table存图片的参考
    以下是我觉得在所有图片存取方法中最简单的方法
    use jpeg,Clipbrd、、、、、、、、、、、、、
    //Save to database
    Image1.Picture.LoadFromFile('FileName');
    if not (Image1.Picture.Graphic Is TBitmap) then
    begin
      ClipBoard.Assign(Image1.Picture);
      Image1.Picture.Bitmap.Assign(ClipBroad);
      ClipBoard.Clear;
    end;//Change the picture that's not belonged to .bmp to .bmp
        // picture 
    Table1.Edit;
    Table1.FieldByName('Image').Assign(Image1.Picture);
    Table1.Post;
    //get from database
    Image1.Picture.Bitmap.Assign(TPicture(Table1.FieldByName('Image')));
      

  7.   


                   adoquery1.Edit ;
                   Tblobfield(adoquery1.FieldByName('zp')).Assign(image1.Picture );
                   adoquery1.Post ;
      

  8.   

    显示:
      
    dbImage1.Picture.Bitmap.Assign(TBLOBField(adoquery1.Fields[0]));
      

  9.   

    If OpenDialog1.Execute then  //保存图形
      begin
        ADOQuery1.Edit;
        TBlobField(ADOQuery1.FieldByName('Pic')).LoadFromFile(OpenDialog1.FileName);
        ADOQuery1.Post;
      end;
      

  10.   

    我的问题始终没有得到更好的解决,冒昧得很,哪位有高招,指点小弟一把
     star_of_light(星星之光) 的用ADO不会有错,(同样的方法若用ODBC或者BDE都不行),但此方法只能用于保存BMP格式的图片,而没办法解决通用的其它格式,如JPG,GIF等,这样一来,造成数据库增大,影响网络传输。
    有没有更好的办法来上传JPG等图形格式呢?
      

  11.   

    我前面介绍的方法我在SQL Server中保存过BMP,JPG图片和Word文档。下面是另一种方法:
    Var
      Fs:TFileStream;
    begin
      If OpenDialog1.Execute then
      begin
        Fs:=TFileStream.Create(OpenDialog1.FileName);        
        ADOQuery1.Edit;
        TBlobField(ADOQuery1.FieldByName('Image')).LoadFromStream(Fs);
        ADOQuery1.Post;
      end;
    end;
      

  12.   

    Var
      Stream:TStream;
    begin
      If OpenDialog1.Execute then
      begin
        try
          Stream:=Query1.CreateBlobStream(Query1.FieldByName('Image'),bmRead);        
          ADOQuery1.Edit;
          TBlobField(Query1.FieldByName('Image')).LoadFromStream(Stream);
        ADOQuery1.Post;
       finally
         Stream.Free;
       end;
      end;
    end;
      

  13.   

    rockynmc (rockynmc) ,我用你的方法,好像库并没有变大啊,你怎么发现图片存到库里了?star_of_light(星星之光) ,assign方法没有在dbimage里显示什么东西,是没存进库里呢?还是没取出?
      

  14.   

    ar_of_light(星星之光) ,你的第二种办法显示不对的呀!?