请教高手:
通过代码存入jpg到access ,by adoquery
procedure TForm1.Button1Click(Sender: TObject);
var
pic:TMemoryStream;
begin
pic:=TMemoryStream.Create;
Image1.Picture.Graphic.SaveToStream(pic);
adoquery1.Close;
adoquery1.SQL.clear;
adoquery1.SQL.Add('insert into 题目(题图) values(:_pic)');
adoquery1.Parameters.ParamByName('_pic').LoadFromStream(pic,ftBlob);
adoquery1.ExecSQL;
end;
通过代码读取图片
procedure TForm1.BitBtn1Click(Sender: TObject);
var
p:Tstream;
jpgorbmp:Tjpegimage;begin
adoquery1.Close;
adoquery1.SQL.Clear;;
adoquery1.SQL.Add('select 题图 from 题目 );
AdoQuery1.Open;
adoquery1.Last;
p:=Tstream.Create;
p:=adoquery1.CreateBlobStream(adoquery1.FieldByName('题图'),bmread);
jpgorbmp:=Tjpegimage.create;
jpgorbmp.LoadFromStream(p);
image2.Picture.Assign(jpgorbmp);
end;
读出正确。
但是通过代码存入jpg到access ,by clientdataset
procedure TForm1.Button1Click(Sender: TObject);
var
pic:TMemoryStream;
begin
pic:=TMemoryStream.Create;
Image1.Picture.Graphic.SaveToStream(pic);
ClientDataSet1.Close;
ClientDataSet1.commandtext:='insert into 题目(题图) values(:_pic)';
ClientDataSet1.Params.ParamByName('_pic').LoadFromStream(pic,ftblob);
ClientDataSet1.Execute;
end;
同样用上边的读取的代码(bitbtnclick),却提示 jpeg error #52。
百思不得其解,为何。谢谢。
数据集数据库连接没有问题,access题目表为空。

解决方案 »

  1.   

    “JPEG error #52”你存進數據庫的不是JPEG,應該是BMP
      

  2.   

    用BMP存的用jpeg取就等于用jpeg的解码方法读BMP的数据流,当然不正常了(BMP文件没有压缩算法,jpeg就有)
      

  3.   

    是jpg,千真万确的jpg。况且同一个文件,我用tadoquery存到数据库里读取正常的,通过clientdataset->dcomconnection->datasetprovider->adoquery存进去,读取就不正常。
      

  4.   

    用adoquery存到数据库都没有问题。
    就是用clientdataset存有问题。
    要不麻烦地主自己测一下先。很急,感谢!
      

  5.   

    用clientdataset存入后,blob字段的内容读出为(0x00-0x60)
    00000000h: F5 F8 3F 00 00 00 10 00 4A 00 46 00 49 00 46 00 ; 貘?.....J.F.I.F.
    00000010h: 00 00 01 00 00 00 01 00 00 00 60 00 00 00 60 00 ; ..........`...`.
    00000020h: 00 00 00 00 F5 F8 00 00 1F 00 4C 00 45 00 41 00 ; ....貘....L.E.A.
    00000030h: 44 00 20 00 54 00 65 00 63 00 68 00 6E 00 6F 00 ; D. .T.e.c.h.n.o.
    00000040h: 6C 00 6F 00 67 00 69 00 65 00 73 00 20 00 49 00 ; l.o.g.i.e.s. .I.
    00000050h: 6E 00 63 00 2E 00 20 00 56 00 31 00 2E 00 30 00 ; n.c... .V.1...0.
    00000060h: 31 00 00 00 F5 F8 00 00 00 00 02 00 02 00 02 00 ; 1...貘..........
    错误的数据,文件扩展名为.jpg时不显示。
    而用adoquery存入,0x00-0x60为
    00000000h: FF D8 FF E0 00 10 4A 46 49 46 00 01 00 01 00 60 ; ??.JFIF.....`
    00000010h: 00 60 00 00 FF FE 00 1F 4C 45 41 44 20 54 65 63 ; .`..?.LEAD Tec
    00000020h: 68 6E 6F 6C 6F 67 69 65 73 20 49 6E 63 2E 20 56 ; hnologies Inc. V
    00000030h: 31 2E 30 31 00 FF DB 00 84 00 02 02 02 02 02 02 ; 1.01.??......
    00000040h: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 ; ................
    00000050h: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 03 03 ; ................
    00000060h: 02 02 03 02 02 02 03 04 03 03 03 03 04 04 04 02 ; ................
    数据正确。
    不知道能不能给各位什么启发。
      

  6.   

    解决了,sql不能用,只好用用edit post什么的了,好几百年没用了。感谢楼上的。
    有什么好的意见继续发表,交流。近日揭贴。
      

  7.   

    好啊问题解决了。
    不过我感觉这有问题
    <Image1.Picture.Graphic.SaveToStream(pic);> 
    Image1中的图片格式已经是BMP了,不管你设计时选择什么格式,或者用Ctrl+C、Ctrl+V粘贴到Image上都会自动转换为Bmp格式。所以你存入的图片肯定是BMP。<jpgorbmp:Tjpegimage;>
    读取的时候改为TBitMap。就能读出来。还有参数的类型要设置一下。
      

  8.   

    如果image转化格式为bmp,那么为什么我用adoquery能顺利存进去? 所以我觉得应该不是image的问题。网上也有人在讨论,tclientdataset中,不好用sql来控制blob,存取其他的没问题。 没搞清楚是不是bug。
      

  9.   

    看我给出的两段数据,by ultraedit的。应该也不是改为bmp格式的,其文件头不是bmp的。
    两段内容差不多,只是原数据间被插入了00, (jiff->j.i.f.j......)
    这个搞搞清楚,就好玩了。
      

  10.   

    楼主的方式只适用于位图。
    存JPEG图最好用
    TADOTable.Fields[X].Assign()的方法。1M以下不会出问题。
    更大的就只好用
    TADOTable.Fields[X].LoadFromStream了。
    去年俺做过的。
      

  11.   

    用楼主方法读到数据库中的JPEG图片就算读入时不出错,也常常会破坏图象。多次试验后发现当图片大于一定值时就会出错。JPEG的格式和BMP完全不同,文件头和文件尾也完全不同,:_pic读不了JPEG格式。